From ce8e63cb9ad3ec4ef3709be67c32c866e6b8e769 Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sat, 31 Dec 2022 15:12:58 -0500 Subject: Add test case for broken indirect object reference ...where the first "number" is an indirect object that happens to be a number. --- qpdf/qtest/parsing.test | 2 +- qpdf/qtest/qpdf/parse-object.out | 1 + qpdf/test_driver.cc | 10 ++++++++-- 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 ]"); -- cgit v1.2.3-54-g00ecf