[poppler] 2 commits - poppler/Form.cc

GitLab Mirror gitlab-mirror at kemper.freedesktop.org
Sat Jan 2 23:25:32 UTC 2021


 poppler/Form.cc |   48 +++++++++++++++++++++++++++++++++++-------------
 1 file changed, 35 insertions(+), 13 deletions(-)

New commits:
commit 3928dde50bfd44d340ef0cb302610cbcf9bece58
Author: Albert Astals Cid <aacid at kde.org>
Date:   Sun Jan 3 00:09:22 2021 +0100

    Account for fread potentially failing

diff --git a/poppler/Form.cc b/poppler/Form.cc
index 0941f4b7..06855785 100644
--- a/poppler/Form.cc
+++ b/poppler/Form.cc
@@ -510,7 +510,9 @@ static bool hashFileRange(FILE *f, SignatureHandler *handler, Goffset start, Gof
         int len = BUF_SIZE;
         if (end - start < len)
             len = end - start;
-        fread(buf, len, 1, f);
+        if (fread(buf, 1, len, f) != static_cast<size_t>(len)) {
+            return false;
+        }
         handler->updateHash(buf, len);
         start += len;
     }
@@ -657,19 +659,21 @@ bool FormWidgetSignature::updateOffsets(FILE *f, Goffset objStart, Goffset objEn
         return false;
     }
 
-    int bufSize = static_cast<int>(objEnd - objStart);
+    const size_t bufSize = static_cast<int>(objEnd - objStart);
     if (Gfseek(f, objStart, SEEK_SET) != 0) {
         return false;
     }
     std::vector<char> buf(bufSize + 1);
-    fread(buf.data(), bufSize, 1, f);
+    if (fread(buf.data(), 1, bufSize, f) != bufSize) {
+        return false;
+    }
     buf[bufSize] = 0; // prevent string functions from searching past the end
 
     // search for the Contents field which contains the signature
     // which always must start with hex digits 308
     *sigStart = -1;
     *sigEnd = -1;
-    for (int i = 0; i < bufSize - 14; i++) {
+    for (size_t i = 0; i < bufSize - 14; i++) {
         if (buf[i] == '/' && strncmp(&buf[i], "/Contents <308", 14) == 0) {
             *sigStart = objStart + i + 10;
             char *p = strchr(&buf[i], '>');
@@ -683,7 +687,7 @@ bool FormWidgetSignature::updateOffsets(FILE *f, Goffset objStart, Goffset objEn
         return false;
 
     // Search for ByteRange array and update offsets
-    for (int i = 0; i < bufSize - 10; i++) {
+    for (size_t i = 0; i < bufSize - 10; i++) {
         if (buf[i] == '/' && strncmp(&buf[i], "/ByteRange", 10) == 0) {
             // update range
             char *p = setNextOffset(&buf[i], *sigStart);
commit ec9420b76c6a1dfc7101b03f475fa0c91fa49a47
Author: Albert Astals Cid <aacid at kde.org>
Date:   Sun Jan 3 00:04:17 2021 +0100

    Account for Gfseek potentially failing

diff --git a/poppler/Form.cc b/poppler/Form.cc
index 5ee2d514..0941f4b7 100644
--- a/poppler/Form.cc
+++ b/poppler/Form.cc
@@ -496,14 +496,17 @@ SignatureInfo *FormWidgetSignature::validateSignature(bool doVerifyCert, bool fo
 
 #ifdef ENABLE_NSS3
 // update hash with the specified range of data from the file
-static void hashFileRange(FILE *f, SignatureHandler *handler, Goffset start, Goffset end)
+static bool hashFileRange(FILE *f, SignatureHandler *handler, Goffset start, Goffset end)
 {
     const int BUF_SIZE = 65536;
 
     unsigned char *buf = new unsigned char[BUF_SIZE];
 
     while (start < end) {
-        Gfseek(f, start, SEEK_SET);
+        if (Gfseek(f, start, SEEK_SET) != 0) {
+            delete[] buf;
+            return false;
+        }
         int len = BUF_SIZE;
         if (end - start < len)
             len = end - start;
@@ -512,6 +515,7 @@ static void hashFileRange(FILE *f, SignatureHandler *handler, Goffset start, Gof
         start += len;
     }
     delete[] buf;
+    return true;
 }
 #endif
 
@@ -570,8 +574,14 @@ bool FormWidgetSignature::signDocument(const char *saveFilename, const char *cer
 
     // compute hash of byte ranges
     sigHandler.restartHash();
-    hashFileRange(file, &sigHandler, 0LL, sigStart);
-    hashFileRange(file, &sigHandler, sigEnd, fileSize);
+    if (!hashFileRange(file, &sigHandler, 0LL, sigStart)) {
+        fclose(file);
+        return false;
+    }
+    if (!hashFileRange(file, &sigHandler, sigEnd, fileSize)) {
+        fclose(file);
+        return false;
+    }
 
     // and sign it
     const std::unique_ptr<GooString> signature = sigHandler.signDetached(password);
@@ -634,7 +644,9 @@ static char *setNextOffset(char *start, Goffset offset)
 // Returns start/end of signature string and file size.
 bool FormWidgetSignature::updateOffsets(FILE *f, Goffset objStart, Goffset objEnd, Goffset *sigStart, Goffset *sigEnd, Goffset *fileSize)
 {
-    Gfseek(f, 0, SEEK_END);
+    if (Gfseek(f, 0, SEEK_END) != 0) {
+        return false;
+    }
     *fileSize = Gftell(f);
 
     if (objEnd > *fileSize)
@@ -646,7 +658,9 @@ bool FormWidgetSignature::updateOffsets(FILE *f, Goffset objStart, Goffset objEn
     }
 
     int bufSize = static_cast<int>(objEnd - objStart);
-    Gfseek(f, objStart, SEEK_SET);
+    if (Gfseek(f, objStart, SEEK_SET) != 0) {
+        return false;
+    }
     std::vector<char> buf(bufSize + 1);
     fread(buf.data(), bufSize, 1, f);
     buf[bufSize] = 0; // prevent string functions from searching past the end
@@ -686,7 +700,9 @@ bool FormWidgetSignature::updateOffsets(FILE *f, Goffset objStart, Goffset objEn
     }
 
     // write buffer back to disk
-    Gfseek(f, objStart, SEEK_SET);
+    if (Gfseek(f, objStart, SEEK_SET) != 0) {
+        return false;
+    }
     fwrite(buf.data(), bufSize, 1, f);
     return true;
 }
@@ -697,7 +713,9 @@ bool FormWidgetSignature::updateSignature(FILE *f, Goffset sigStart, Goffset sig
     if (signature->getLength() * 2 + 2 != sigEnd - sigStart)
         return false;
 
-    Gfseek(f, sigStart, SEEK_SET);
+    if (Gfseek(f, sigStart, SEEK_SET) != 0) {
+        return false;
+    }
     const char *c = signature->c_str();
     fprintf(f, "<");
     for (int i = 0; i < signature->getLength(); i++) {


More information about the poppler mailing list