summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorqkzk <qu3nt1n@gmail.com>2024-02-27 22:15:59 +0100
committerqkzk <qu3nt1n@gmail.com>2024-02-27 22:15:59 +0100
commit64791f4b3d668b87de3f366daa287bf149e17de5 (patch)
treedc0739e4002d8290eaad756cbf42a7a3e43ceba7
parentdab5ed4d75e9af2f70db7cd7be914033f4edb583 (diff)
FIX: too many open files. pdf opened by Poppler...new_from_file aren't closed properly.
-rw-r--r--development.md2
-rw-r--r--src/modes/display/preview.rs15
2 files changed, 15 insertions, 2 deletions
diff --git a/development.md b/development.md
index b676a82..7b7f3c4 100644
--- a/development.md
+++ b/development.md
@@ -934,6 +934,8 @@ New view: Tree ! Toggle with 't', fold with 'z'. Navigate normally.
- [x] open temp file from bulk
- [x] open multiple files
- [ ] use the new mpsc event parser to read commands from stdin or RPC
+- [x] FIX: too many open files. pdf opened by Poppler...new_from_file aren't closed properly.
+ Open manually and and use Poppler...new_from_data.
## TODO
diff --git a/src/modes/display/preview.rs b/src/modes/display/preview.rs
index 4332cc0..3634caa 100644
--- a/src/modes/display/preview.rs
+++ b/src/modes/display/preview.rs
@@ -899,8 +899,11 @@ impl Ueberzug {
/// It may fail (and surelly crash the app) if the pdf is password protected.
/// We pass a generic password which is hardcoded.
fn make_pdf_thumbnail(pdf_path: &Path, index: usize) -> Result<usize> {
+ let mut data: Vec<u8> = std::fs::read(pdf_path)?;
+ // let doc: poppler::PopplerDocument =
+ // poppler::PopplerDocument::new_from_file(pdf_path, "upw")?;
let doc: poppler::PopplerDocument =
- poppler::PopplerDocument::new_from_file(pdf_path, "upw")?;
+ poppler::PopplerDocument::new_from_data(&mut data[..], "upw")?;
let length = doc.get_n_pages();
if index >= length {
return Err(anyhow!(
@@ -917,8 +920,16 @@ impl Ueberzug {
page.render(&ctx);
ctx.restore()?;
ctx.show_page()?;
- let mut file = std::fs::File::create(THUMBNAIL_PATH)?;
+ let Ok(mut file) = std::fs::File::create(THUMBNAIL_PATH) else {
+ return Ok(0);
+ };
surface.write_to_png(&mut file)?;
+ surface.finish();
+ // those drops should be useless
+ drop(doc);
+ drop(ctx);
+ drop(page);
+ drop(surface);
Ok(length)
}