Commit 805c1ad47968e33e1296af9a31492f6916ad9113

Authored by m-holger
1 parent 2b7e9ba2

Reset QPDFValue::qpdf and QPDFValue::og when the owning QPDF object gets destroyed

libqpdf/QPDF.cc
... ... @@ -259,6 +259,7 @@ QPDF::~QPDF()
259 259 this->m->xref_table.clear();
260 260 for (auto const& iter: this->m->obj_cache) {
261 261 QPDFObject::ObjAccessor::releaseResolved(iter.second.object.get());
  262 + iter.second.object->resetObjGen();
262 263 }
263 264 }
264 265  
... ...
qpdf/qtest/type-checks.test
... ... @@ -14,7 +14,7 @@ cleanup();
14 14  
15 15 my $td = new TestDriver('type-checks');
16 16  
17   -my $n_tests = 5;
  17 +my $n_tests = 6;
18 18  
19 19 # Whenever object-types.pdf is edited, object-types-os.pdf should be
20 20 # regenerated.
... ... @@ -43,6 +43,10 @@ $td->runtest("compound type checks",
43 43 {$td->COMMAND => "test_driver 82 object-types-os.pdf"},
44 44 {$td->STRING => "test 82 done\n", $td->EXIT_STATUS => 0},
45 45 $td->NORMALIZE_NEWLINES);
  46 +$td->runtest("indirect objects belonging to destroyed QPDF",
  47 + {$td->COMMAND => "test_driver 92 -"},
  48 + {$td->STRING => "test 92 done\n", $td->EXIT_STATUS => 0},
  49 + $td->NORMALIZE_NEWLINES);
46 50  
47 51 cleanup();
48 52 $td->report($n_tests);
... ...
qpdf/test_driver.cc
... ... @@ -3258,6 +3258,20 @@ test_91(QPDF& pdf, char const* arg2)
3258 3258 2, &p, qpdf_dl_none, qpdf_sj_inline, "", std::set<std::string>());
3259 3259 }
3260 3260  
  3261 +static void
  3262 +test_92(QPDF& pdf, char const* arg2)
  3263 +{
  3264 + // Exercise indirect objects owned by destroyed QPDF object.
  3265 + QPDF* qpdf = new QPDF();
  3266 + qpdf->emptyPDF();
  3267 + auto root = qpdf->getRoot();
  3268 + assert(root.getOwningQPDF() != nullptr);
  3269 + assert(root.isIndirect());
  3270 + delete qpdf;
  3271 + assert(root.getOwningQPDF() == nullptr);
  3272 + assert(!root.isIndirect());
  3273 +}
  3274 +
3261 3275 void
3262 3276 runtest(int n, char const* filename1, char const* arg2)
3263 3277 {
... ... @@ -3265,7 +3279,7 @@ runtest(int n, char const* filename1, char const* arg2)
3265 3279 // the test suite to see how the test is invoked to find the file
3266 3280 // that the test is supposed to operate on.
3267 3281  
3268   - std::set<int> ignore_filename = {61, 81, 83, 84, 85, 86, 87};
  3282 + std::set<int> ignore_filename = {61, 81, 83, 84, 85, 86, 87, 92};
3269 3283  
3270 3284 if (n == 0) {
3271 3285 // Throw in some random test cases that don't fit anywhere
... ... @@ -3362,7 +3376,8 @@ runtest(int n, char const* filename1, char const* arg2)
3362 3376 {76, test_76}, {77, test_77}, {78, test_78}, {79, test_79},
3363 3377 {80, test_80}, {81, test_81}, {82, test_82}, {83, test_83},
3364 3378 {84, test_84}, {85, test_85}, {86, test_86}, {87, test_87},
3365   - {88, test_88}, {89, test_89}, {90, test_90}, {91, test_91}};
  3379 + {88, test_88}, {89, test_89}, {90, test_90}, {91, test_91},
  3380 + {92, test_92}};
3366 3381  
3367 3382 auto fn = test_functions.find(n);
3368 3383 if (fn == test_functions.end()) {
... ...