aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2022-12-31 21:12:58 +0100
committerJay Berkenbilt <ejb@ql.org>2022-12-31 21:12:58 +0100
commitce8e63cb9ad3ec4ef3709be67c32c866e6b8e769 (patch)
tree12cb2c8a5ecf2c4fa775cde868dd6f33edee5ee7
parent234e323743a48c3818313c887d029233fd210a15 (diff)
downloadqpdf-ce8e63cb9ad3ec4ef3709be67c32c866e6b8e769.tar.zst
Add test case for broken indirect object reference
...where the first "number" is an indirect object that happens to be a number.
-rw-r--r--qpdf/qtest/parsing.test2
-rw-r--r--qpdf/qtest/qpdf/parse-object.out1
-rw-r--r--qpdf/test_driver.cc10
3 files changed, 10 insertions, 3 deletions
diff --git a/qpdf/qtest/parsing.test b/qpdf/qtest/parsing.test
index dcadce10..23edcac4 100644
--- a/qpdf/qtest/parsing.test
+++ b/qpdf/qtest/parsing.test
@@ -17,7 +17,7 @@ my $td = new TestDriver('parsing');
my $n_tests = 17;
$td->runtest("parse objects from string",
- {$td->COMMAND => "test_driver 31 minimal.pdf"}, # file not used
+ {$td->COMMAND => "test_driver 31 good1.qdf"},
{$td->FILE => "parse-object.out", $td->EXIT_STATUS => 0},
$td->NORMALIZE_NEWLINES);
$td->runtest("EOF terminating literal tokens",
diff --git a/qpdf/qtest/qpdf/parse-object.out b/qpdf/qtest/qpdf/parse-object.out
index 456e2f80..929623cc 100644
--- a/qpdf/qtest/qpdf/parse-object.out
+++ b/qpdf/qtest/qpdf/parse-object.out
@@ -1,4 +1,5 @@
[ /name 16059 3.14159 false << /key true /other [ (string1) (string2) ] >> null ]
logic error parsing indirect: QPDFObjectHandle::parse called without context on an object with indirect references
trailing data: parsed object (trailing test): trailing data found parsing object from string
+broken indirect object reference: parsed object: trailing data found parsing object from string
test 31 done
diff --git a/qpdf/test_driver.cc b/qpdf/test_driver.cc
index 1224fd09..3a907464 100644
--- a/qpdf/test_driver.cc
+++ b/qpdf/test_driver.cc
@@ -1228,8 +1228,6 @@ test_30(QPDF& pdf, char const* arg2)
static void
test_31(QPDF& pdf, char const* arg2)
{
- // Test object parsing from a string. The input file is not used.
-
auto o1 = "[/name 16059 3.14159 false\n"
" << /key true /other [ (string1) (string2) ] >> null]"_qpdf;
std::cout << o1.unparse() << std::endl;
@@ -1247,6 +1245,14 @@ test_31(QPDF& pdf, char const* arg2)
} catch (std::runtime_error const& e) {
std::cout << "trailing data: " << e.what() << std::endl;
}
+ try {
+ assert(QPDFObjectHandle::parse(&pdf, "5 0 R").isInteger());
+ QPDFObjectHandle::parse(&pdf, "5 0 R 0 R");
+ std::cout << "oops -- didn't throw" << std::endl;
+ } catch (std::runtime_error const& e) {
+ std::cout << "broken indirect object reference: " << e.what()
+ << std::endl;
+ }
assert(
QPDFObjectHandle::parse(&pdf, "[1 0 R]", "indirect test").unparse() ==
"[ 1 0 R ]");