Commit a77f58142d07c5482c90f5ce0e3dbb9c98451c2a

Authored by Jay Berkenbilt
1 parent 3f05429c

Remove some assertions that are not necessarily true (fixes #514)

Operations that add the same object to multiple places in the pages
tree are throwing exceptions and then later causing assertion
failures. The assert calls shouldn't be there.
Showing 2 changed files with 27 additions and 4 deletions
1 1 Document-level work
2 2 ===================
3 3  
  4 +* Implement the tree helper described in the ABI section and provide
  5 + the getPagesTree method so QPDF::getAllPages can be deprecated in
  6 + 10.4 and people have time to transition before qpdf 11. Maybe I
  7 + should have a qpdf 11 branch so I can make sure I have the
  8 + interfaces the way I want them before releasing 10.4.
  9 +
4 10 * QPDFPageCopier -- object for moving pages around within files or
5 11 between files and performing various transformations
6 12  
... ... @@ -182,6 +188,25 @@ Comments appear in the code prefixed by "ABI"
182 188 before copying, though maybe we don't because it could cause
183 189 multiple copies to be made...usually it's better to handle that
184 190 explicitly.
  191 +* (Also API) Create a helper class for tree structures like the pages
  192 + tree that have /Kids and /Count. It would be great to be able to
  193 + eliminate flattenPagesTree and all the page object to page caching,
  194 + and to get rid of getAllPages() that returns a reference to an
  195 + internal data structure. The tree helper object can have
  196 + bidirectional iterator and const_iterator, implement at and
  197 + operator[], and have reasonable insertion and deletion semantics.
  198 + Then a new getAllPages, perhaps getPagesTree, can return that and
  199 + make it easy to change existing code even if it assumes the result
  200 + of getAllPages() is mutating automatically as the pages tree is
  201 + manipulated. This will free us up to finally get rid of the
  202 + troublesome pages cache and its exposure by getAllPages. See also
  203 + note below with "balance the pages tree". Maybe we can get rid of
  204 + pageobj_to_pages_pos as well or convert it into something that is
  205 + merely advisory and not so heavily trusted. We should either make
  206 + the code not care if the same object appears more than once in the
  207 + pages tree or detect it and shallow copy, though the latter would
  208 + cause a significant performance penalty when manipulating pages if
  209 + we get rid of the cache.
185 210  
186 211 Page splitting/merging
187 212 ======================
... ... @@ -334,6 +359,8 @@ directory or that are otherwise not publicly accessible. This includes
334 359 things sent to me by email that are specifically not public. Even so,
335 360 I find it useful to make reference to them in this list.
336 361  
  362 + * Get rid of remaining assert() calls from non-test code.
  363 +
337 364 * Consider updating the fuzzer with code that exercises
338 365 copyAnnotations, file attachments, and name and number trees. Check
339 366 fuzzer coverage.
... ...
libqpdf/QPDF_pages.cc
... ... @@ -255,13 +255,11 @@ QPDF::insertPage(QPDFObjectHandle newpage, int pos)
255 255 int npages = kids.getArrayNItems();
256 256 pages.replaceKey("/Count", QPDFObjectHandle::newInteger(npages));
257 257 this->m->all_pages.insert(this->m->all_pages.begin() + pos, newpage);
258   - assert(this->m->all_pages.size() == QIntC::to_size(npages));
259 258 for (int i = pos + 1; i < npages; ++i)
260 259 {
261 260 insertPageobjToPage(this->m->all_pages.at(toS(i)), i, false);
262 261 }
263 262 insertPageobjToPage(newpage, pos, true);
264   - assert(this->m->pageobj_to_pages_pos.size() == QIntC::to_size(npages));
265 263 }
266 264  
267 265 void
... ... @@ -280,9 +278,7 @@ QPDF::removePage(QPDFObjectHandle page)
280 278 int npages = kids.getArrayNItems();
281 279 pages.replaceKey("/Count", QPDFObjectHandle::newInteger(npages));
282 280 this->m->all_pages.erase(this->m->all_pages.begin() + pos);
283   - assert(this->m->all_pages.size() == QIntC::to_size(npages));
284 281 this->m->pageobj_to_pages_pos.erase(page.getObjGen());
285   - assert(this->m->pageobj_to_pages_pos.size() == QIntC::to_size(npages));
286 282 for (int i = pos; i < npages; ++i)
287 283 {
288 284 insertPageobjToPage(this->m->all_pages.at(toS(i)), i, false);
... ...