Commit a77f58142d07c5482c90f5ce0e3dbb9c98451c2a
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
TODO
| 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); | ... | ... |