aboutsummaryrefslogtreecommitdiffstats
path: root/qpdf
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2024-01-12 13:11:46 +0100
committerJay Berkenbilt <ejb@ql.org>2024-01-12 14:05:22 +0100
commitebb10f3256067c6e4ebea9a21a92d0199ac7fdf9 (patch)
tree5e1d6152bd2cf05f0c0a52e1467cea4dc88df3df /qpdf
parent2c97aaddd50aacd849bd9d97102d21275fde94a2 (diff)
downloadqpdf-ebb10f3256067c6e4ebea9a21a92d0199ac7fdf9.tar.zst
Fix null pointer issue on array copy
Diffstat (limited to 'qpdf')
-rw-r--r--qpdf/qpdf.testcov1
-rw-r--r--qpdf/qtest/many-nulls.test6
-rw-r--r--qpdf/test_driver.cc12
3 files changed, 17 insertions, 2 deletions
diff --git a/qpdf/qpdf.testcov b/qpdf/qpdf.testcov
index 397cbf97..6d0f8a4b 100644
--- a/qpdf/qpdf.testcov
+++ b/qpdf/qpdf.testcov
@@ -692,3 +692,4 @@ QPDF recover xref stream 0
QPDFJob misplaced page range 0
QPDFJob duplicated range 0
QPDFJob json over/under no file 0
+QPDF_Array copy 1
diff --git a/qpdf/qtest/many-nulls.test b/qpdf/qtest/many-nulls.test
index 744075f0..8a723d53 100644
--- a/qpdf/qtest/many-nulls.test
+++ b/qpdf/qtest/many-nulls.test
@@ -29,5 +29,9 @@ $td->runtest("run check file",
{$td->COMMAND => "qpdf --check a.pdf"},
{$td->FILE => "many-nulls.out", $td->EXIT_STATUS => 0},
$td->NORMALIZE_NEWLINES);
+$td->runtest("copy sparse array",
+ {$td->COMMAND => "test_driver 97 many-nulls.pdf"},
+ {$td->STRING => "test 97 done\n", $td->EXIT_STATUS => 0},
+ $td->NORMALIZE_NEWLINES);
cleanup();
-$td->report(3);
+$td->report(4);
diff --git a/qpdf/test_driver.cc b/qpdf/test_driver.cc
index 2b8eb761..472a96a1 100644
--- a/qpdf/test_driver.cc
+++ b/qpdf/test_driver.cc
@@ -3366,6 +3366,16 @@ test_96(QPDF& pdf, char const* arg2)
assert(s.unparseBinary() == "<abc0>");
}
+static void
+test_97(QPDF& pdf, char const* arg2)
+{
+ // Shallow array copy. This test uses many-nulls.pdf.
+ auto nulls = pdf.getTrailer().getKey("/Nulls").getArrayItem(0);
+ assert(nulls.isArray() && nulls.getArrayNItems() > 10000);
+ auto nulls2 = nulls.shallowCopy();
+ assert(nulls.unparse() == nulls2.unparse());
+}
+
void
runtest(int n, char const* filename1, char const* arg2)
{
@@ -3467,7 +3477,7 @@ runtest(int n, char const* filename1, char const* arg2)
{78, test_78}, {79, test_79}, {80, test_80}, {81, test_81}, {82, test_82}, {83, test_83},
{84, test_84}, {85, test_85}, {86, test_86}, {87, test_87}, {88, test_88}, {89, test_89},
{90, test_90}, {91, test_91}, {92, test_92}, {93, test_93}, {94, test_94}, {95, test_95},
- {96, test_96}};
+ {96, test_96}, {97, test_97}};
auto fn = test_functions.find(n);
if (fn == test_functions.end()) {