glib/poppler-document.cc | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-)
New commits: commit 6299164caa78bc3b90154f9580a17e1aa112b5cd Author: Christian Persch <[email protected]> Date: Sun Mar 27 23:10:13 2022 +0200 glib: Fix mem leak in poppler_document_new_from_fd Someone needs to own the GooFile that's referenced by FileStream. Add a simple OwningFileStream class that does that. Fixes: https://gitlab.freedesktop.org/poppler/poppler/-/issues/1227 diff --git a/glib/poppler-document.cc b/glib/poppler-document.cc index 84584314..a74312ff 100644 --- a/glib/poppler-document.cc +++ b/glib/poppler-document.cc @@ -285,6 +285,19 @@ public: BytesStream::~BytesStream() = default; +class OwningFileStream final : public FileStream +{ +public: + OwningFileStream(std::unique_ptr<GooFile> fileA, Object &&dictA) : FileStream(fileA.get(), 0, false, fileA->size(), std::move(dictA)), file(std::move(fileA)) { } + + ~OwningFileStream() override; + +private: + std::unique_ptr<GooFile> file; +}; + +OwningFileStream::~OwningFileStream() = default; + /** * poppler_document_new_from_bytes: * @bytes: a #GBytes @@ -499,9 +512,7 @@ PopplerDocument *poppler_document_new_from_fd(int fd, const char *password, GErr CachedFile *cachedFile = new CachedFile(new FILECacheLoader(file), nullptr); stream = new CachedFileStream(cachedFile, 0, false, cachedFile->getLength(), Object(objNull)); } else { - std::unique_ptr<GooFile> file = GooFile::open(fd); - // FIXME file is getting leak here - stream = new FileStream(file.release(), 0, false, file->size(), Object(objNull)); + stream = new OwningFileStream(GooFile::open(fd), Object(objNull)); } const std::optional<GooString> password_g = poppler_password_to_latin1(password);
