Commit 6c2fb5b8f0015b655edec9c6c44c3bbef44d03ba
1 parent
d0650980
Add test for bad data and bad datafile
Showing
7 changed files
with
156 additions
and
9 deletions
TODO
| ... | ... | @@ -61,7 +61,7 @@ Make sure pages tree repair generates warnings. |
| 61 | 61 | * Have a test case if possible that exercises the object description |
| 62 | 62 | which means we need some kind of semantic error that gets caught |
| 63 | 63 | after creation. |
| 64 | -* Test invalid data, invalid data file | |
| 64 | +* Document that /Length is ignored in stream dictionary replacements | |
| 65 | 65 | |
| 66 | 66 | Try to never flatten pages tree. Make sure we do something reasonable |
| 67 | 67 | with pages tree repair. The problem is that if pages tree repair is | ... | ... |
libqpdf/QPDFWriter.cc
| ... | ... | @@ -1419,14 +1419,21 @@ QPDFWriter::willFilterStream( |
| 1419 | 1419 | pushPipeline(new Pl_Buffer("stream data")); |
| 1420 | 1420 | PipelinePopper pp_stream_data(this, stream_data); |
| 1421 | 1421 | activatePipelineStack(pp_stream_data); |
| 1422 | - filtered = stream.pipeStreamData( | |
| 1423 | - this->m->pipeline, | |
| 1424 | - (((filter && normalize) ? qpdf_ef_normalize : 0) | | |
| 1425 | - ((filter && compress_stream) ? qpdf_ef_compress : 0)), | |
| 1426 | - (filter ? (uncompress ? qpdf_dl_all : this->m->stream_decode_level) | |
| 1427 | - : qpdf_dl_none), | |
| 1428 | - false, | |
| 1429 | - (attempt == 1)); | |
| 1422 | + try { | |
| 1423 | + filtered = stream.pipeStreamData( | |
| 1424 | + this->m->pipeline, | |
| 1425 | + (((filter && normalize) ? qpdf_ef_normalize : 0) | | |
| 1426 | + ((filter && compress_stream) ? qpdf_ef_compress : 0)), | |
| 1427 | + (filter | |
| 1428 | + ? (uncompress ? qpdf_dl_all : this->m->stream_decode_level) | |
| 1429 | + : qpdf_dl_none), | |
| 1430 | + false, | |
| 1431 | + (attempt == 1)); | |
| 1432 | + } catch (std::runtime_error& e) { | |
| 1433 | + throw std::runtime_error( | |
| 1434 | + "error while getting stream data for " + stream.unparse() + | |
| 1435 | + ": " + e.what()); | |
| 1436 | + } | |
| 1430 | 1437 | if (filter && (!filtered)) { |
| 1431 | 1438 | // Try again |
| 1432 | 1439 | filter = false; | ... | ... |
qpdf/qtest/qpdf-json.test
qpdf/qtest/qpdf/qjson-bad-data.json
0 → 100644
| 1 | +{ | |
| 2 | + "qpdf-v2": { | |
| 3 | + "pdfversion": "1.3", | |
| 4 | + "maxobjectid": 6, | |
| 5 | + "objects": { | |
| 6 | + "obj:1 0 R": { | |
| 7 | + "value": { | |
| 8 | + "/Pages": "2 0 R", | |
| 9 | + "/Type": "/Catalog" | |
| 10 | + } | |
| 11 | + }, | |
| 12 | + "obj:2 0 R": { | |
| 13 | + "value": { | |
| 14 | + "/Count": 1, | |
| 15 | + "/Kids": [ | |
| 16 | + "3 0 R" | |
| 17 | + ], | |
| 18 | + "/Type": "/Pages" | |
| 19 | + } | |
| 20 | + }, | |
| 21 | + "obj:3 0 R": { | |
| 22 | + "value": { | |
| 23 | + "/Contents": ["4 0 R", "7 0 R"], | |
| 24 | + "/MediaBox": [ | |
| 25 | + 0, | |
| 26 | + 0, | |
| 27 | + 612, | |
| 28 | + 792 | |
| 29 | + ], | |
| 30 | + "/Parent": "2 0 R", | |
| 31 | + "/Resources": { | |
| 32 | + "/Font": { | |
| 33 | + "/F1": "6 0 R" | |
| 34 | + }, | |
| 35 | + "/ProcSet": "5 0 R" | |
| 36 | + }, | |
| 37 | + "/Type": "/Page" | |
| 38 | + } | |
| 39 | + }, | |
| 40 | + "obj:4 0 R": { | |
| 41 | + "stream": { | |
| 42 | + "data": "@not-base64@", | |
| 43 | + "dict": {} | |
| 44 | + } | |
| 45 | + }, | |
| 46 | + "obj:5 0 R": { | |
| 47 | + "value": [ | |
| 48 | + "/PDF", | |
| 49 | + "/Text" | |
| 50 | + ] | |
| 51 | + }, | |
| 52 | + "obj:6 0 R": { | |
| 53 | + "value": { | |
| 54 | + "/BaseFont": "/Helvetica", | |
| 55 | + "/Encoding": "/WinAnsiEncoding", | |
| 56 | + "/Subtype": "/Type1", | |
| 57 | + "/Type": "/Font" | |
| 58 | + } | |
| 59 | + }, | |
| 60 | + "trailer": { | |
| 61 | + "value": { | |
| 62 | + "/Root": "1 0 R", | |
| 63 | + "/Size": 7 | |
| 64 | + } | |
| 65 | + } | |
| 66 | + } | |
| 67 | + } | |
| 68 | +} | ... | ... |
qpdf/qtest/qpdf/qjson-bad-data.out
0 → 100644
| 1 | +qpdf: error while getting stream data for 4 0 R: base64-decode: base64 decode: invalid input | ... | ... |
qpdf/qtest/qpdf/qjson-bad-datafile.json
0 → 100644
| 1 | +{ | |
| 2 | + "qpdf-v2": { | |
| 3 | + "pdfversion": "1.3", | |
| 4 | + "maxobjectid": 6, | |
| 5 | + "objects": { | |
| 6 | + "obj:1 0 R": { | |
| 7 | + "value": { | |
| 8 | + "/Pages": "2 0 R", | |
| 9 | + "/Type": "/Catalog" | |
| 10 | + } | |
| 11 | + }, | |
| 12 | + "obj:2 0 R": { | |
| 13 | + "value": { | |
| 14 | + "/Count": 1, | |
| 15 | + "/Kids": [ | |
| 16 | + "3 0 R" | |
| 17 | + ], | |
| 18 | + "/Type": "/Pages" | |
| 19 | + } | |
| 20 | + }, | |
| 21 | + "obj:3 0 R": { | |
| 22 | + "value": { | |
| 23 | + "/Contents": ["4 0 R", "7 0 R"], | |
| 24 | + "/MediaBox": [ | |
| 25 | + 0, | |
| 26 | + 0, | |
| 27 | + 612, | |
| 28 | + 792 | |
| 29 | + ], | |
| 30 | + "/Parent": "2 0 R", | |
| 31 | + "/Resources": { | |
| 32 | + "/Font": { | |
| 33 | + "/F1": "6 0 R" | |
| 34 | + }, | |
| 35 | + "/ProcSet": "5 0 R" | |
| 36 | + }, | |
| 37 | + "/Type": "/Page" | |
| 38 | + } | |
| 39 | + }, | |
| 40 | + "obj:4 0 R": { | |
| 41 | + "stream": { | |
| 42 | + "datafile": "file does not exist", | |
| 43 | + "dict": {} | |
| 44 | + } | |
| 45 | + }, | |
| 46 | + "obj:5 0 R": { | |
| 47 | + "value": [ | |
| 48 | + "/PDF", | |
| 49 | + "/Text" | |
| 50 | + ] | |
| 51 | + }, | |
| 52 | + "obj:6 0 R": { | |
| 53 | + "value": { | |
| 54 | + "/BaseFont": "/Helvetica", | |
| 55 | + "/Encoding": "/WinAnsiEncoding", | |
| 56 | + "/Subtype": "/Type1", | |
| 57 | + "/Type": "/Font" | |
| 58 | + } | |
| 59 | + }, | |
| 60 | + "trailer": { | |
| 61 | + "value": { | |
| 62 | + "/Root": "1 0 R", | |
| 63 | + "/Size": 7 | |
| 64 | + } | |
| 65 | + } | |
| 66 | + } | |
| 67 | + } | |
| 68 | +} | ... | ... |
qpdf/qtest/qpdf/qjson-bad-datafile.out
0 → 100644
| 1 | +qpdf: error while getting stream data for 4 0 R: open file does not exist: No such file or directory | ... | ... |