[poppler] poppler/JBIG2Stream.cc poppler/JBIG2Stream.h
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Sun Dec 1 19:15:51 UTC 2019
poppler/JBIG2Stream.cc | 16 +++++++++++-----
poppler/JBIG2Stream.h | 2 ++
2 files changed, 13 insertions(+), 5 deletions(-)
New commits:
commit f401ad7a29b95a39db0c2333b2c8f3573374140b
Author: Even Rouault <even.rouault at spatialys.com>
Date: Sun Dec 1 19:15:49 2019 +0000
JBIG2Stream: fix leak in reset() if called several times
JBIG2Stream::reset() currently allocates new values for the
segments and globalSegments member variable. This causes a
memory leak if the method is called several times, which can
be triggered by the GDAL library that uses Poppler.
So add a freeSegments() method where we move the related cleanup
of close(), and call that method from reset() and close().
diff --git a/poppler/JBIG2Stream.cc b/poppler/JBIG2Stream.cc
index 1486fe25..684ed090 100644
--- a/poppler/JBIG2Stream.cc
+++ b/poppler/JBIG2Stream.cc
@@ -1244,6 +1244,8 @@ JBIG2Stream::~JBIG2Stream() {
}
void JBIG2Stream::reset() {
+ freeSegments();
+
// read the globals stream
globalSegments = new std::vector<JBIG2Segment*>();
if (globalsStream.isStream()) {
@@ -1274,11 +1276,7 @@ void JBIG2Stream::reset() {
}
}
-void JBIG2Stream::close() {
- if (pageBitmap) {
- delete pageBitmap;
- pageBitmap = nullptr;
- }
+void JBIG2Stream::freeSegments() {
if (segments) {
for (auto entry : *segments) {
delete entry;
@@ -1293,6 +1291,14 @@ void JBIG2Stream::close() {
delete globalSegments;
globalSegments = nullptr;
}
+}
+
+void JBIG2Stream::close() {
+ if (pageBitmap) {
+ delete pageBitmap;
+ pageBitmap = nullptr;
+ }
+ freeSegments();
dataPtr = dataEnd = nullptr;
FilterStream::close();
}
diff --git a/poppler/JBIG2Stream.h b/poppler/JBIG2Stream.h
index 2a82ea14..3feeccc1 100644
--- a/poppler/JBIG2Stream.h
+++ b/poppler/JBIG2Stream.h
@@ -61,6 +61,8 @@ private:
bool hasGetChars() override { return true; }
int getChars(int nChars, unsigned char *buffer) override;
+ void freeSegments();
+
void readSegments();
bool readSymbolDictSeg(unsigned int segNum, unsigned int length,
unsigned int *refSegs, unsigned int nRefSegs);
More information about the poppler
mailing list