From 988662aa997c78d776472e857b8afd917f4a5be2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gr=C3=A9gory=20Soutad=C3=A9?= Date: Fri, 23 Dec 2022 16:55:09 +0100 Subject: [PATCH] Be sure Size contains max ID --- src/uPDFParser.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/uPDFParser.cpp b/src/uPDFParser.cpp index 5813497..bd9fd42 100644 --- a/src/uPDFParser.cpp +++ b/src/uPDFParser.cpp @@ -605,6 +605,8 @@ namespace uPDFParser char* subs, c; int ret; ret = read(fd, buffer, sizeof(buffer)); + if (ret <= 0) + EXCEPTION(TRUNCATED_FILE, "Unexpected end of file"); subs = (char*)memmem((void*)buffer, ret, (void*)"endstream", 9); if (subs) { @@ -852,6 +854,7 @@ namespace uPDFParser ::write(newFd, "\r", 1); + int maxId = 0; std::stringstream xref; int nbNewObjects = 0; @@ -861,14 +864,17 @@ namespace uPDFParser std::vector::iterator it; for(it=_objects.begin(); it!=_objects.end(); it++) { - if (!(*it)->isNew()) + Object* object = *it; + if (object->objectId() > maxId) + maxId = object->objectId(); + if (!object->isNew()) continue; nbNewObjects ++; - std::string objStr = (*it)->str(); + std::string objStr = object->str(); curOffset = lseek(newFd, 0, SEEK_CUR); ::write(newFd, objStr.c_str(), objStr.size()); - xref << std::setw(0) << (*it)->objectId() << " 1\n"; - xref << std::setw(10) << curOffset << " " << std::setw(5) << (*it)->generationNumber() << " n\r\n"; // Here \r seems important + xref << std::setw(0) << object->objectId() << " 1\n"; + xref << std::setw(10) << curOffset << " " << std::setw(5) << object->generationNumber() << " n\r\n"; // Here \r seems important } if (!nbNewObjects) @@ -885,6 +891,8 @@ namespace uPDFParser trailer.deleteKey("Prev"); if (xrefOffset != (off_t)-1) trailer.dictionary().addData("Prev", new Integer((int)xrefOffset)); + trailer.deleteKey("Size"); + trailer.dictionary().addData("Size", new Integer(maxId+1)); std::string trailerStr = trailer.dictionary().str(); ::write(newFd, "trailer\n", 8);