File 0004-Avoid-leaking-Compressor-instance.patch of Package kdegraphics-mobipocket
From 7685e806a775924031d612f366763ee24992428c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Stefan=20Br=C3=BCns?= <stefan.bruens@rwth-aachen.de>
Date: Fri, 28 Feb 2025 22:53:09 +0100
Subject: [PATCH 4/4] Avoid leaking Compressor instance
The compressor instance is allocated on the heap, but never deleted.
As the decompressor is private API, return a unique_ptr instead of
a raw pointer to manage lifetime.
Valgrind also reports the error:
==3360743== 24 bytes in 1 blocks are definitely lost in loss record 8 of 39
==3360743== at 0x4847F3F: operator new(unsigned long) (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==3360743== by 0x7D11E93: Mobipocket::Decompressor::create(unsigned char, Mobipocket::PDB const&) (decompressor.cpp:237)
---
lib/decompressor.cpp | 8 ++++----
lib/decompressor.h | 3 ++-
lib/mobipocket.cpp | 2 +-
3 files changed, 7 insertions(+), 6 deletions(-)
diff --git a/lib/decompressor.cpp b/lib/decompressor.cpp
index 94d4d0c..d212ddf 100644
--- a/lib/decompressor.cpp
+++ b/lib/decompressor.cpp
@@ -231,12 +231,12 @@ fail:
valid=false;
}
-Decompressor* Decompressor::create(quint8 type, const PDB& pdb)
+std::unique_ptr<Decompressor> Decompressor::create(quint8 type, const PDB& pdb)
{
switch (type) {
- case 1 : return new NOOPDecompressor(pdb);
- case 2 : return new RLEDecompressor(pdb);
- case 'H' : return new HuffdicDecompressor(pdb);
+ case 1 : return std::make_unique<NOOPDecompressor>(pdb);
+ case 2 : return std::make_unique<RLEDecompressor>(pdb);
+ case 'H' : return std::make_unique<HuffdicDecompressor>(pdb);
default : return nullptr;
}
diff --git a/lib/decompressor.h b/lib/decompressor.h
index dfe0421..3181e66 100644
--- a/lib/decompressor.h
+++ b/lib/decompressor.h
@@ -11,6 +11,7 @@
#define MOBI_DECOMPRESSOR_H
#include <QByteArray>
+#include <memory>
namespace Mobipocket {
class PDB;
@@ -22,7 +23,7 @@ public:
virtual ~Decompressor() {}
bool isValid() const { return valid; }
- static Decompressor* create(quint8 type, const PDB& pdb);
+ static std::unique_ptr<Decompressor> create(quint8 type, const PDB& pdb);
protected:
const PDB& pdb;
bool valid;
diff --git a/lib/mobipocket.cpp b/lib/mobipocket.cpp
index 278b868..988a34d 100644
--- a/lib/mobipocket.cpp
+++ b/lib/mobipocket.cpp
@@ -107,7 +107,7 @@ struct DocumentPrivate
DocumentPrivate(Stream* d) : pdb(d), valid(true), firstImageRecord(0),
drm(false), thumbnailIndex(0) {}
PDB pdb;
- Decompressor* dec;
+ std::unique_ptr<Decompressor> dec;
quint16 ntextrecords;
quint16 maxRecordSize;
bool valid;
--
2.48.1