Commit fc88837d4b04c8b766c973206303c3d3af334b92

Authored by Jay Berkenbilt
1 parent 6fe7b704

Treat /EmbeddedFiles as a proper name tree

If we ever had an encrypted file with different filters for
attachments and either the /EmbeddedFiles name tree was deep or some
of the file specs didn't have /Type, we would have overlooked those as
attachment streams. The code now properly handles /EmbeddedFiles as a
name tree.
Showing 2 changed files with 13 additions and 11 deletions
ChangeLog
  1 +2021-01-11 Jay Berkenbilt <ejb@ql.org>
  2 +
  3 + * Fix very old error in code that was finding attachment streams.
  4 + Probably this error never mattered, but the code was still not
  5 + exactly right.
  6 +
1 2021-01-06 Jay Berkenbilt <ejb@ql.org> 7 2021-01-06 Jay Berkenbilt <ejb@ql.org>
2 8
3 * Give warnings instead of segfaulting if a QPDF operation is 9 * Give warnings instead of segfaulting if a QPDF operation is
libqpdf/QPDF.cc
@@ -18,6 +18,7 @@ @@ -18,6 +18,7 @@
18 #include <qpdf/FileInputSource.hh> 18 #include <qpdf/FileInputSource.hh>
19 #include <qpdf/BufferInputSource.hh> 19 #include <qpdf/BufferInputSource.hh>
20 #include <qpdf/OffsetInputSource.hh> 20 #include <qpdf/OffsetInputSource.hh>
  21 +#include <qpdf/QPDFNameTreeObjectHelper.hh>
21 22
22 #include <qpdf/QPDFExc.hh> 23 #include <qpdf/QPDFExc.hh>
23 #include <qpdf/QPDF_Null.hh> 24 #include <qpdf/QPDF_Null.hh>
@@ -3004,22 +3005,17 @@ QPDF::findAttachmentStreams() @@ -3004,22 +3005,17 @@ QPDF::findAttachmentStreams()
3004 { 3005 {
3005 return; 3006 return;
3006 } 3007 }
3007 - QPDFObjectHandle embeddedFiles = names.getKey("/EmbeddedFiles");  
3008 - if (! embeddedFiles.isDictionary()) 3008 + QPDFObjectHandle embedded_files = names.getKey("/EmbeddedFiles");
  3009 + if (! embedded_files.isDictionary())
3009 { 3010 {
3010 return; 3011 return;
3011 } 3012 }
3012 - names = embeddedFiles.getKey("/Names");  
3013 - if (! names.isArray()) 3013 + QPDFNameTreeObjectHelper ef_tree(embedded_files);
  3014 + auto ef_tree_map = ef_tree.getAsMap();
  3015 + for (auto& i: ef_tree_map)
3014 { 3016 {
3015 - return;  
3016 - }  
3017 - for (int i = 0; i < names.getArrayNItems(); ++i)  
3018 - {  
3019 - QPDFObjectHandle item = names.getArrayItem(i); 3017 + QPDFObjectHandle item = i.second;
3020 if (item.isDictionary() && 3018 if (item.isDictionary() &&
3021 - item.getKey("/Type").isName() &&  
3022 - (item.getKey("/Type").getName() == "/Filespec") &&  
3023 item.getKey("/EF").isDictionary() && 3019 item.getKey("/EF").isDictionary() &&
3024 item.getKey("/EF").getKey("/F").isStream()) 3020 item.getKey("/EF").getKey("/F").isStream())
3025 { 3021 {