Commit 6c2fb5b8f0015b655edec9c6c44c3bbef44d03ba

Authored by Jay Berkenbilt
1 parent d0650980

Add test for bad data and bad datafile

@@ -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