diff options
author | Albert Astals Cid <aacid@kde.org> | 2021-01-03 00:04:17 +0100 |
---|---|---|
committer | Albert Astals Cid <aacid@kde.org> | 2021-01-03 00:04:17 +0100 |
commit | ec9420b76c6a1dfc7101b03f475fa0c91fa49a47 (patch) | |
tree | 32be83c02d8404cf435b8059ec7c29615566bc04 | |
parent | 7e4ec140d1cc6bef375e38f3cf3f613dd7c88bbb (diff) |
Account for Gfseek potentially failing
-rw-r--r-- | poppler/Form.cc | 34 |
1 files changed, 26 insertions, 8 deletions
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++) { |