Prevent poppler page request for too large page numbers
This commit is contained in:
parent
636aa14be3
commit
9d8713f622
18
src/cache.rs
18
src/cache.rs
@ -51,25 +51,27 @@ impl PageCache {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn cache_page(&mut self, page_number: PageNumber, height: i32) -> Option<CacheResponse> {
|
pub fn cache_page(&mut self, page_number: PageNumber, height: i32) -> Result<Option<CacheResponse>> {
|
||||||
debug!("Caching page {}", page_number);
|
debug!("Caching page {}", page_number);
|
||||||
if page_number.abs_diff(self.last_requested_page_number)
|
if page_number.abs_diff(self.last_requested_page_number)
|
||||||
> self.max_num_stored_pages.div_ceil(2)
|
> self.max_num_stored_pages.div_ceil(2)
|
||||||
{
|
{
|
||||||
debug!("Page too far from reader, aborting caching call");
|
bail!("Page too far from reader, aborting caching call");
|
||||||
return None;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let begin_of_cashing = Instant::now();
|
|
||||||
if let Some(page) = self.pages.get(&page_number) {
|
if let Some(page) = self.pages.get(&page_number) {
|
||||||
if page.height() >= height {
|
if page.height() >= height {
|
||||||
debug!("Page already in cache");
|
debug!("Page already in cache");
|
||||||
return None;
|
return Ok(None);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if page_number >= self.document.n_pages() as usize {
|
||||||
|
bail!("Requested page {} has too high number and is not in the document", page_number);
|
||||||
|
}
|
||||||
|
|
||||||
|
let begin_of_cashing = Instant::now();
|
||||||
let mut response = None;
|
let mut response = None;
|
||||||
|
|
||||||
|
println!("Getting page form poppler: {}", page_number);
|
||||||
if let Some(page) = self.document.page(page_number as i32) {
|
if let Some(page) = self.document.page(page_number as i32) {
|
||||||
let pages = vec![Rc::new(page)];
|
let pages = vec![Rc::new(page)];
|
||||||
let texture = draw::draw_pages_to_texture(&pages, height, &self.color_mode);
|
let texture = draw::draw_pages_to_texture(&pages, height, &self.color_mode);
|
||||||
@ -91,7 +93,7 @@ impl PageCache {
|
|||||||
page_number,
|
page_number,
|
||||||
begin_of_cashing.elapsed().as_millis()
|
begin_of_cashing.elapsed().as_millis()
|
||||||
);
|
);
|
||||||
response
|
Ok(response)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn remove_most_distant_page(&mut self) -> anyhow::Result<()> {
|
fn remove_most_distant_page(&mut self) -> anyhow::Result<()> {
|
||||||
@ -130,7 +132,7 @@ impl PageCache {
|
|||||||
fn process_command(&mut self, command: CacheCommand) -> Result<Option<CacheResponse>> {
|
fn process_command(&mut self, command: CacheCommand) -> Result<Option<CacheResponse>> {
|
||||||
debug!("Processing command: {:?}...", command);
|
debug!("Processing command: {:?}...", command);
|
||||||
match command {
|
match command {
|
||||||
CacheCommand::Cache(command) => Ok(self.cache_page(command.page, command.height)),
|
CacheCommand::Cache(command) => Ok(self.cache_page(command.page, command.height)?),
|
||||||
CacheCommand::Retrieve(command) => match command {
|
CacheCommand::Retrieve(command) => match command {
|
||||||
RetrievePagesCommand::GetCurrentTwoPages { page_left_number } => {
|
RetrievePagesCommand::GetCurrentTwoPages { page_left_number } => {
|
||||||
let page_left = self.get_page_or_cache(page_left_number)?;
|
let page_left = self.get_page_or_cache(page_left_number)?;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user