From 9d8713f622e545f7c6eb55270b5053242d2e62b6 Mon Sep 17 00:00:00 2001 From: Julian Mutter Date: Sun, 8 Dec 2024 15:21:49 +0100 Subject: [PATCH] Prevent poppler page request for too large page numbers --- src/cache.rs | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/cache.rs b/src/cache.rs index 2bdadd1..82a8323 100644 --- a/src/cache.rs +++ b/src/cache.rs @@ -51,25 +51,27 @@ impl PageCache { } } - pub fn cache_page(&mut self, page_number: PageNumber, height: i32) -> Option { + pub fn cache_page(&mut self, page_number: PageNumber, height: i32) -> Result> { debug!("Caching page {}", page_number); if page_number.abs_diff(self.last_requested_page_number) > self.max_num_stored_pages.div_ceil(2) { - debug!("Page too far from reader, aborting caching call"); - return None; + bail!("Page too far from reader, aborting caching call"); } - - let begin_of_cashing = Instant::now(); if let Some(page) = self.pages.get(&page_number) { if page.height() >= height { 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; + println!("Getting page form poppler: {}", page_number); if let Some(page) = self.document.page(page_number as i32) { let pages = vec![Rc::new(page)]; let texture = draw::draw_pages_to_texture(&pages, height, &self.color_mode); @@ -91,7 +93,7 @@ impl PageCache { page_number, begin_of_cashing.elapsed().as_millis() ); - response + Ok(response) } fn remove_most_distant_page(&mut self) -> anyhow::Result<()> { @@ -130,7 +132,7 @@ impl PageCache { fn process_command(&mut self, command: CacheCommand) -> Result> { debug!("Processing command: {:?}...", 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 { RetrievePagesCommand::GetCurrentTwoPages { page_left_number } => { let page_left = self.get_page_or_cache(page_left_number)?;