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,7 +61,7 @@ Make sure pages tree repair generates warnings. | ||
| 61 | * Have a test case if possible that exercises the object description | 61 | * Have a test case if possible that exercises the object description |
| 62 | which means we need some kind of semantic error that gets caught | 62 | which means we need some kind of semantic error that gets caught |
| 63 | after creation. | 63 | after creation. |
| 64 | -* Test invalid data, invalid data file | 64 | +* Document that /Length is ignored in stream dictionary replacements |
| 65 | 65 | ||
| 66 | Try to never flatten pages tree. Make sure we do something reasonable | 66 | Try to never flatten pages tree. Make sure we do something reasonable |
| 67 | with pages tree repair. The problem is that if pages tree repair is | 67 | with pages tree repair. The problem is that if pages tree repair is |
libqpdf/QPDFWriter.cc
| @@ -1419,14 +1419,21 @@ QPDFWriter::willFilterStream( | @@ -1419,14 +1419,21 @@ QPDFWriter::willFilterStream( | ||
| 1419 | pushPipeline(new Pl_Buffer("stream data")); | 1419 | pushPipeline(new Pl_Buffer("stream data")); |
| 1420 | PipelinePopper pp_stream_data(this, stream_data); | 1420 | PipelinePopper pp_stream_data(this, stream_data); |
| 1421 | activatePipelineStack(pp_stream_data); | 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 | if (filter && (!filtered)) { | 1437 | if (filter && (!filtered)) { |
| 1431 | // Try again | 1438 | // Try again |
| 1432 | filter = false; | 1439 | filter = false; |
qpdf/qtest/qpdf-json.test
| @@ -33,6 +33,8 @@ my @badfiles = ( | @@ -33,6 +33,8 @@ my @badfiles = ( | ||
| 33 | 'missing-trailer', | 33 | 'missing-trailer', |
| 34 | 'missing-objects', | 34 | 'missing-objects', |
| 35 | 'obj-key-errors', | 35 | 'obj-key-errors', |
| 36 | + 'bad-data', | ||
| 37 | + 'bad-datafile', | ||
| 36 | ); | 38 | ); |
| 37 | 39 | ||
| 38 | $n_tests += scalar(@badfiles); | 40 | $n_tests += scalar(@badfiles); |
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 |