Commit 718b14008ba9c1ad43ff2bfadfa70a60acdfdb82
1 parent
ff0affd8
Change QPDFWriter stream_decode_level default to qpdf_dl_generalized
Also, fix disabling of preserve_encryption to be ignore stream_decode_level, but disable preserve_encryption if compress_streams is false. Fixes #1286
Showing
10 changed files
with
21 additions
and
6 deletions
ChangeLog
| ... | ... | @@ -3,6 +3,11 @@ |
| 3 | 3 | * Add C API function qpdf_oh_free_buffer to release memory allocated |
| 4 | 4 | by stream data functions. |
| 5 | 5 | |
| 6 | +2024-09-19 M Holger <m.holger@qpdf.org> | |
| 7 | + | |
| 8 | + * Bug fix: QPDFWriter stream DecodeLevel incorrectly defaulted to | |
| 9 | + none instead of generalied. Fixes #1286. | |
| 10 | + | |
| 6 | 11 | 2024-08-25 M Holger <m.holger@qpdf.org> |
| 7 | 12 | |
| 8 | 13 | * Add new command-line arguments --remove-metadata and --remove-info | ... | ... |
libqpdf/QPDFWriter.cc
| ... | ... | @@ -2126,7 +2126,7 @@ QPDFWriter::doWriteSetup() |
| 2126 | 2126 | if (m->encrypted) { |
| 2127 | 2127 | // Encryption has been explicitly set |
| 2128 | 2128 | m->preserve_encryption = false; |
| 2129 | - } else if (m->normalize_content || m->stream_decode_level || m->pclm || m->qdf_mode) { | |
| 2129 | + } else if (m->normalize_content || !m->compress_streams || m->pclm || m->qdf_mode) { | |
| 2130 | 2130 | // Encryption makes looking at contents pretty useless. If the user explicitly encrypted |
| 2131 | 2131 | // though, we still obey that. |
| 2132 | 2132 | m->preserve_encryption = false; | ... | ... |
libqpdf/qpdf/QPDFWriter_private.hh
| ... | ... | @@ -65,7 +65,7 @@ class QPDFWriter::Members |
| 65 | 65 | bool normalize_content{false}; |
| 66 | 66 | bool compress_streams{true}; |
| 67 | 67 | bool compress_streams_set{false}; |
| 68 | - qpdf_stream_decode_level_e stream_decode_level{qpdf_dl_none}; | |
| 68 | + qpdf_stream_decode_level_e stream_decode_level{qpdf_dl_generalized}; | |
| 69 | 69 | bool stream_decode_level_set{false}; |
| 70 | 70 | bool recompress_flate{false}; |
| 71 | 71 | bool qdf_mode{false}; | ... | ... |
qpdf/qtest/encryption.test
| ... | ... | @@ -723,7 +723,7 @@ $td->runtest("check file's validity", |
| 723 | 723 | $td->runtest("handle missing/invalid Length", |
| 724 | 724 | {$td->COMMAND => "qpdf --check bad-encryption-length.pdf"}, |
| 725 | 725 | {$td->FILE => "bad-encryption-length.out", |
| 726 | - $td->EXIT_STATUS => 0}, | |
| 726 | + $td->EXIT_STATUS => 3}, | |
| 727 | 727 | $td->NORMALIZE_NEWLINES); |
| 728 | 728 | |
| 729 | 729 | cleanup(); | ... | ... |
qpdf/qtest/inline-images.test
| ... | ... | @@ -56,7 +56,7 @@ $td->runtest("externalize damaged image", |
| 56 | 56 | "qpdf --externalize-inline-images" . |
| 57 | 57 | " --compress-streams=n --static-id" . |
| 58 | 58 | " damaged-inline-image.pdf a.pdf"}, |
| 59 | - {$td->STRING => "", $td->EXIT_STATUS => 0}, | |
| 59 | + {$td->FILE => "damaged-inline-image.out", $td->EXIT_STATUS => 3}, | |
| 60 | 60 | $td->NORMALIZE_NEWLINES); |
| 61 | 61 | $td->runtest("check output", |
| 62 | 62 | {$td->FILE => "a.pdf"}, | ... | ... |
qpdf/qtest/qpdf/bad-encryption-length.out
| ... | ... | @@ -14,5 +14,5 @@ modify annotations: allowed |
| 14 | 14 | modify other: allowed |
| 15 | 15 | modify anything: allowed |
| 16 | 16 | File is not linearized |
| 17 | -No syntax or stream encoding errors found; the file may still contain | |
| 18 | -errors that qpdf cannot detect | |
| 17 | +WARNING: bad-encryption-length.pdf, object 7 0 at offset 531 -> dictionary key /Length: operation for integer attempted on object of type null: returning 0 | |
| 18 | +qpdf: operation succeeded with warnings | ... | ... |
qpdf/qtest/qpdf/damaged-inline-image.out
0 → 100644
| 1 | +WARNING: damaged-inline-image.pdf, stream object 8 0: error while getting stream data: stream inflate: inflate: data: invalid distance too far back | |
| 2 | +WARNING: damaged-inline-image.pdf, stream object 8 0: qpdf will attempt to write the damaged stream unchanged | |
| 3 | +qpdf: operation succeeded with warnings; resulting file may have some problems | ... | ... |
qpdf/qtest/qpdf/fuzz-16214.out
| ... | ... | @@ -6,6 +6,11 @@ WARNING: fuzz-16214.pdf (xref stream, offset 116): Cross-reference stream data h |
| 6 | 6 | WARNING: fuzz-16214.pdf: reported number of objects (6) is not one plus the highest object number (35) |
| 7 | 7 | WARNING: fuzz-16214.pdf (object 14 0, offset 652): expected dictionary key but found non-name object; inserting key /QPDFFake1 |
| 8 | 8 | WARNING: fuzz-16214.pdf (object 14 0, offset 734): expected endobj |
| 9 | +WARNING: fuzz-16214.pdf (object 15 0, offset 869): unknown token while reading object; treating as string | |
| 10 | +WARNING: fuzz-16214.pdf (object 15 0, offset 745): expected dictionary key but found non-name object; inserting key /QPDFFake1 | |
| 11 | +WARNING: fuzz-16214.pdf (object 15 0, offset 894): expected endobj | |
| 12 | +WARNING: fuzz-16214.pdf, object 15 0 at offset 745: kid 0 (from 0) MediaBox is undefined; setting to letter / ANSI A | |
| 13 | +WARNING: fuzz-16214.pdf, object 15 0 at offset 745: /Type key should be /Page but is not; overriding | |
| 9 | 14 | WARNING: fuzz-16214.pdf: file is damaged |
| 10 | 15 | WARNING: fuzz-16214.pdf (object 1 0, offset 7189): expected n n obj |
| 11 | 16 | WARNING: fuzz-16214.pdf: Attempting to reconstruct cross-reference table | ... | ... |
qpdf/qtest/qpdf/invalid-id-xref.out
| ... | ... | @@ -15,4 +15,6 @@ modify annotations: allowed |
| 15 | 15 | modify other: not allowed |
| 16 | 16 | modify anything: not allowed |
| 17 | 17 | File is not linearized |
| 18 | +WARNING: invalid-id-xref.pdf, trailer at offset 910 -> dictionary key /ID: operation for array attempted on object of type null: returning null | |
| 19 | +WARNING: invalid-id-xref.pdf, trailer at offset 910 -> dictionary key /ID -> null returned from invalid array access: operation for string attempted on object of type null: returning empty string | |
| 18 | 20 | qpdf: operation succeeded with warnings | ... | ... |
qpdf/qtest/qpdf/job-json-input-file-password.pdf