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

openSUSE Build Service is sponsored by