Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package kdegraphics-mobipocket for 
openSUSE:Factory checked in at 2026-08-24 12:02:50
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/kdegraphics-mobipocket (Old)
 and      /work/SRC/openSUSE:Factory/.kdegraphics-mobipocket.new.1258 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "kdegraphics-mobipocket"

Mon Aug 24 12:02:50 2026 rev:32 rq:1372376 version:26.08.0

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/kdegraphics-mobipocket/kdegraphics-mobipocket.changes
    2026-07-02 22:05:35.240886311 +0200
+++ 
/work/SRC/openSUSE:Factory/.kdegraphics-mobipocket.new.1258/kdegraphics-mobipocket.changes
  2026-08-24 12:04:28.736703734 +0200
@@ -1,0 +2,29 @@
+Sun Aug 16 07:26:58 UTC 2026 - Christophe Marin <[email protected]>
+
+- Update to 26.08.0
+  * New feature release
+  * For more details please see:
+  * https://kde.org/announcements/gear/26.08.0/
+- Changes since 26.07.90:
+  * DocumentPrivate::init: return early if dec is not valid
+  * Protect against malformed header size
+
+-------------------------------------------------------------------
+Sat Aug  1 11:38:41 UTC 2026 - Christophe Marin <[email protected]>
+
+- Update to 26.07.90
+  * New feature release
+- No code change since 26.07.80
+
+-------------------------------------------------------------------
+Sat Jul 18 11:11:21 UTC 2026 - Christophe Marin <[email protected]>
+
+- Update to 26.07.80
+  * New feature release
+- Changes since 26.04.3:
+  * Don't check for size of parseEXTH twice
+  * Harden bounds validation in DocumentPrivate::parseEXTH
+  * Prevent integer underflow in DocumentPrivate::parseEXTH
+  *  ecm_generate_export_header: fix spurious } to USE_VERSION_HEADER arg
+
+-------------------------------------------------------------------

Old:
----
  kdegraphics-mobipocket-26.04.3.tar.xz
  kdegraphics-mobipocket-26.04.3.tar.xz.sig

New:
----
  kdegraphics-mobipocket-26.08.0.tar.xz
  kdegraphics-mobipocket-26.08.0.tar.xz.sig

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ kdegraphics-mobipocket.spec ++++++
--- /var/tmp/diff_new_pack.V0Uadt/_old  2026-08-24 12:04:30.475765136 +0200
+++ /var/tmp/diff_new_pack.V0Uadt/_new  2026-08-24 12:04:30.478765242 +0200
@@ -16,12 +16,12 @@
 #
 
 
-%define kf6_version 6.19.0
+%define kf6_version 6.27.0
 %define qt6_version 6.9.0
 
 %bcond_without released
 Name:           kdegraphics-mobipocket
-Version:        26.04.3
+Version:        26.08.0
 Release:        0
 Summary:        E-book plugin and library
 License:        GPL-2.0-or-later


++++++ kdegraphics-mobipocket-26.04.3.tar.xz -> 
kdegraphics-mobipocket-26.08.0.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/kdegraphics-mobipocket-26.04.3/autotests/mobipockettest.cpp 
new/kdegraphics-mobipocket-26.08.0/autotests/mobipockettest.cpp
--- old/kdegraphics-mobipocket-26.04.3/autotests/mobipockettest.cpp     
2026-01-17 15:19:16.000000000 +0100
+++ new/kdegraphics-mobipocket-26.08.0/autotests/mobipockettest.cpp     
2026-07-31 17:13:34.000000000 +0200
@@ -28,6 +28,7 @@
     void testText();
     void testThumbnail();
     void testTruncation();
+    void testInvalidExthRecordLength();
 };
 
 void MobipocketTest::testMetadata()
@@ -110,6 +111,18 @@
     }
 }
 
+void MobipocketTest::testInvalidExthRecordLength()
+{
+    QFile 
file(testFilePath(QStringLiteral("invalid-exth-record-length.mobi")));
+    QVERIFY(file.open(QFile::ReadOnly));
+
+    // Should not hang, timeout, or crash on malformed EXTH records
+    Mobipocket::Document doc(&file);
+
+    const auto text = doc.text();
+    const auto thumb = doc.thumbnail();
+}
+
 QTEST_GUILESS_MAIN(MobipocketTest)
 
 #include "mobipockettest.moc"
Binary files 
old/kdegraphics-mobipocket-26.04.3/autotests/testdata/invalid-exth-record-length.mobi
 and 
new/kdegraphics-mobipocket-26.08.0/autotests/testdata/invalid-exth-record-length.mobi
 differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kdegraphics-mobipocket-26.04.3/lib/CMakeLists.txt 
new/kdegraphics-mobipocket-26.08.0/lib/CMakeLists.txt
--- old/kdegraphics-mobipocket-26.04.3/lib/CMakeLists.txt       2026-01-17 
15:19:16.000000000 +0100
+++ new/kdegraphics-mobipocket-26.08.0/lib/CMakeLists.txt       2026-07-31 
17:13:34.000000000 +0200
@@ -26,7 +26,7 @@
 ecm_generate_export_header(qmobipocket
      VERSION ${QMOBIPOCKET_VERSION}
      DEPRECATED_BASE_VERSION 0
-     USE_VERSION_HEADER}
+     USE_VERSION_HEADER
 )
 
 target_link_libraries (qmobipocket
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kdegraphics-mobipocket-26.04.3/lib/mobipocket.cpp 
new/kdegraphics-mobipocket-26.08.0/lib/mobipocket.cpp
--- old/kdegraphics-mobipocket-26.04.3/lib/mobipocket.cpp       2026-01-17 
15:19:16.000000000 +0100
+++ new/kdegraphics-mobipocket-26.08.0/lib/mobipocket.cpp       2026-07-31 
17:13:34.000000000 +0200
@@ -16,8 +16,7 @@
 namespace Mobipocket
 {
 
-struct DocumentPrivate 
-{
+struct DocumentPrivate {
     DocumentPrivate(QIODevice *d)
         : pdb(d)
     {
@@ -79,7 +78,7 @@
     const QVector<QByteArray> getHuffRecords(const PDB &pdb)
     {
         const QByteArray header = pdb.getRecord(0);
-        if (header[1] != 'H') {
+        if (header.size() < 0x78 || header[1] != 'H') {
             return {};
         }
 
@@ -116,7 +115,7 @@
     dec = Decompressor::create(mhead[1], getHuffRecords(pdb));
     if ((int)mhead[12] != 0 || (int)mhead[13] != 0)
         drm = true;
-    if (!dec)
+    if (!dec || !dec->isValid())
         return;
 
     ntextrecords = qFromBigEndian<quint16>(mhead.constData() + 8);
@@ -132,8 +131,8 @@
             toUtf16 = QStringDecoder(QStringConverter::Latin1);
         }
     }
-    if (mhead.size() >= 92)
-        parseEXTH(mhead);
+
+    parseEXTH(mhead);
 
     if (mhead.size() >= 244) {
         quint32 exthoffs = qFromBigEndian<quint32>(mhead.constData() + 20);
@@ -166,17 +165,20 @@
 
 void DocumentPrivate::parseEXTH(QByteArrayView data)
 {
+    if (data.size() < 92)
+        return;
+
     // try to get name
-    if (data.size() >= 92) {
-        qint32 nameoffset = qFromBigEndian<quint32>(data.constData() + 84);
-        qint32 namelen = qFromBigEndian<quint32>(data.constData() + 88);
-        if ((nameoffset + namelen) <= data.size()) {
-            metadata[Document::Title] = toUtf16(data.mid(nameoffset, namelen));
-        }
+    qint32 nameoffset = qFromBigEndian<quint32>(data.constData() + 84);
+    qint32 namelen = qFromBigEndian<quint32>(data.constData() + 88);
+    const qint32 ssize = qint32(data.size());
+    if (nameoffset >= 0 && namelen >= 0 && nameoffset <= ssize && namelen <= 
ssize - nameoffset) {
+        metadata[Document::Title] = toUtf16(data.mid(nameoffset, namelen));
     }
 
+    const quint32 size = quint32(data.size());
     quint32 exthoffs = qFromBigEndian<quint32>(data.constData() + 20);
-    if (exthoffs + 28 > quint32(data.size())) {
+    if (exthoffs > size - 28) {
         return;
     }
 
@@ -185,11 +187,11 @@
     quint32 records = qFromBigEndian<quint32>(data.constData() + exthoffs + 
24);
     quint32 offset = exthoffs + 28;
     for (unsigned int i = 0; i < records; i++) {
-        if (offset + 8 > quint32(data.size()))
+        if (offset > size - 8)
             break;
         quint32 type = qFromBigEndian<quint32>(data.constData() + offset);
         quint32 len = qFromBigEndian<quint32>(data.constData() + offset + 4);
-        if (offset + len > quint32(data.size()))
+        if (len < 8 || len > size - offset)
             break;
         switch (type) {
         case 100:
@@ -205,10 +207,12 @@
             metadata[Document::Copyright] = toUtf16(data.mid(offset + 8, len - 
8));
             break;
         case 201:
-            coverIndex = qFromBigEndian<quint32>(data.constData() + offset + 
8);
+            if (len >= 12)
+                coverIndex = qFromBigEndian<quint32>(data.constData() + offset 
+ 8);
             break;
         case 202:
-            thumbnailIndex = qFromBigEndian<quint32>(data.constData() + offset 
+ 8);
+            if (len >= 12)
+                thumbnailIndex = qFromBigEndian<quint32>(data.constData() + 
offset + 8);
             break;
         default:
             // ignore

Reply via email to