summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2022-05-20 19:32:59 +0200
committerJay Berkenbilt <ejb@ql.org>2022-05-20 19:33:30 +0200
commit6c2fb5b8f0015b655edec9c6c44c3bbef44d03ba (patch)
treedea831e7e2dd609be1ffcc66c8e882996ea633de
parentd06509808957305ed01497568ddd81a2590362f8 (diff)
downloadqpdf-6c2fb5b8f0015b655edec9c6c44c3bbef44d03ba.tar.zst
Add test for bad data and bad datafile
-rw-r--r--TODO2
-rw-r--r--libqpdf/QPDFWriter.cc23
-rw-r--r--qpdf/qtest/qpdf-json.test2
-rw-r--r--qpdf/qtest/qpdf/qjson-bad-data.json68
-rw-r--r--qpdf/qtest/qpdf/qjson-bad-data.out1
-rw-r--r--qpdf/qtest/qpdf/qjson-bad-datafile.json68
-rw-r--r--qpdf/qtest/qpdf/qjson-bad-datafile.out1
7 files changed, 156 insertions, 9 deletions
diff --git a/TODO b/TODO
index ea6cf42f..eed33e6d 100644
--- a/TODO
+++ b/TODO
@@ -61,7 +61,7 @@ Make sure pages tree repair generates warnings.
* Have a test case if possible that exercises the object description
which means we need some kind of semantic error that gets caught
after creation.
-* Test invalid data, invalid data file
+* Document that /Length is ignored in stream dictionary replacements
Try to never flatten pages tree. Make sure we do something reasonable
with pages tree repair. The problem is that if pages tree repair is
diff --git a/libqpdf/QPDFWriter.cc b/libqpdf/QPDFWriter.cc
index 35041249..70c65c5d 100644
--- a/libqpdf/QPDFWriter.cc
+++ b/libqpdf/QPDFWriter.cc
@@ -1419,14 +1419,21 @@ QPDFWriter::willFilterStream(
pushPipeline(new Pl_Buffer("stream data"));
PipelinePopper pp_stream_data(this, stream_data);
activatePipelineStack(pp_stream_data);
- filtered = stream.pipeStreamData(
- this->m->pipeline,
- (((filter && normalize) ? qpdf_ef_normalize : 0) |
- ((filter && compress_stream) ? qpdf_ef_compress : 0)),
- (filter ? (uncompress ? qpdf_dl_all : this->m->stream_decode_level)
- : qpdf_dl_none),
- false,
- (attempt == 1));
+ try {
+ filtered = stream.pipeStreamData(
+ this->m->pipeline,
+ (((filter && normalize) ? qpdf_ef_normalize : 0) |
+ ((filter && compress_stream) ? qpdf_ef_compress : 0)),
+ (filter
+ ? (uncompress ? qpdf_dl_all : this->m->stream_decode_level)
+ : qpdf_dl_none),
+ false,
+ (attempt == 1));
+ } catch (std::runtime_error& e) {
+ throw std::runtime_error(
+ "error while getting stream data for " + stream.unparse() +
+ ": " + e.what());
+ }
if (filter && (!filtered)) {
// Try again
filter = false;
diff --git a/qpdf/qtest/qpdf-json.test b/qpdf/qtest/qpdf-json.test
index dda056a1..22b714c5 100644
--- a/qpdf/qtest/qpdf-json.test
+++ b/qpdf/qtest/qpdf-json.test
@@ -33,6 +33,8 @@ my @badfiles = (
'missing-trailer',
'missing-objects',
'obj-key-errors',
+ 'bad-data',
+ 'bad-datafile',
);
$n_tests += scalar(@badfiles);
diff --git a/qpdf/qtest/qpdf/qjson-bad-data.json b/qpdf/qtest/qpdf/qjson-bad-data.json
new file mode 100644
index 00000000..9b8880d4
--- /dev/null
+++ b/qpdf/qtest/qpdf/qjson-bad-data.json
@@ -0,0 +1,68 @@
+{
+ "qpdf-v2": {
+ "pdfversion": "1.3",
+ "maxobjectid": 6,
+ "objects": {
+ "obj:1 0 R": {
+ "value": {
+ "/Pages": "2 0 R",
+ "/Type": "/Catalog"
+ }
+ },
+ "obj:2 0 R": {
+ "value": {
+ "/Count": 1,
+ "/Kids": [
+ "3 0 R"
+ ],
+ "/Type": "/Pages"
+ }
+ },
+ "obj:3 0 R": {
+ "value": {
+ "/Contents": ["4 0 R", "7 0 R"],
+ "/MediaBox": [
+ 0,
+ 0,
+ 612,
+ 792
+ ],
+ "/Parent": "2 0 R",
+ "/Resources": {
+ "/Font": {
+ "/F1": "6 0 R"
+ },
+ "/ProcSet": "5 0 R"
+ },
+ "/Type": "/Page"
+ }
+ },
+ "obj:4 0 R": {
+ "stream": {
+ "data": "@not-base64@",
+ "dict": {}
+ }
+ },
+ "obj:5 0 R": {
+ "value": [
+ "/PDF",
+ "/Text"
+ ]
+ },
+ "obj:6 0 R": {
+ "value": {
+ "/BaseFont": "/Helvetica",
+ "/Encoding": "/WinAnsiEncoding",
+ "/Subtype": "/Type1",
+ "/Type": "/Font"
+ }
+ },
+ "trailer": {
+ "value": {
+ "/Root": "1 0 R",
+ "/Size": 7
+ }
+ }
+ }
+ }
+}
diff --git a/qpdf/qtest/qpdf/qjson-bad-data.out b/qpdf/qtest/qpdf/qjson-bad-data.out
new file mode 100644
index 00000000..e5cf46bb
--- /dev/null
+++ b/qpdf/qtest/qpdf/qjson-bad-data.out
@@ -0,0 +1 @@
+qpdf: error while getting stream data for 4 0 R: base64-decode: base64 decode: invalid input
diff --git a/qpdf/qtest/qpdf/qjson-bad-datafile.json b/qpdf/qtest/qpdf/qjson-bad-datafile.json
new file mode 100644
index 00000000..025f700b
--- /dev/null
+++ b/qpdf/qtest/qpdf/qjson-bad-datafile.json
@@ -0,0 +1,68 @@
+{
+ "qpdf-v2": {
+ "pdfversion": "1.3",
+ "maxobjectid": 6,
+ "objects": {
+ "obj:1 0 R": {
+ "value": {
+ "/Pages": "2 0 R",
+ "/Type": "/Catalog"
+ }
+ },
+ "obj:2 0 R": {
+ "value": {
+ "/Count": 1,
+ "/Kids": [
+ "3 0 R"
+ ],
+ "/Type": "/Pages"
+ }
+ },
+ "obj:3 0 R": {
+ "value": {
+ "/Contents": ["4 0 R", "7 0 R"],
+ "/MediaBox": [
+ 0,
+ 0,
+ 612,
+ 792
+ ],
+ "/Parent": "2 0 R",
+ "/Resources": {
+ "/Font": {
+ "/F1": "6 0 R"
+ },
+ "/ProcSet": "5 0 R"
+ },
+ "/Type": "/Page"
+ }
+ },
+ "obj:4 0 R": {
+ "stream": {
+ "datafile": "file does not exist",
+ "dict": {}
+ }
+ },
+ "obj:5 0 R": {
+ "value": [
+ "/PDF",
+ "/Text"
+ ]
+ },
+ "obj:6 0 R": {
+ "value": {
+ "/BaseFont": "/Helvetica",
+ "/Encoding": "/WinAnsiEncoding",
+ "/Subtype": "/Type1",
+ "/Type": "/Font"
+ }
+ },
+ "trailer": {
+ "value": {
+ "/Root": "1 0 R",
+ "/Size": 7
+ }
+ }
+ }
+ }
+}
diff --git a/qpdf/qtest/qpdf/qjson-bad-datafile.out b/qpdf/qtest/qpdf/qjson-bad-datafile.out
new file mode 100644
index 00000000..1ef4f028
--- /dev/null
+++ b/qpdf/qtest/qpdf/qjson-bad-datafile.out
@@ -0,0 +1 @@
+qpdf: error while getting stream data for 4 0 R: open file does not exist: No such file or directory