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 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
... ... @@ -33,6 +33,8 @@ my @badfiles = (
33 33 'missing-trailer',
34 34 'missing-objects',
35 35 'obj-key-errors',
  36 + 'bad-data',
  37 + 'bad-datafile',
36 38 );
37 39  
38 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
... ...