Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package kdegraphics-thumbnailers for 
openSUSE:Factory checked in at 2025-12-15 11:48:11
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/kdegraphics-thumbnailers (Old)
 and      /work/SRC/openSUSE:Factory/.kdegraphics-thumbnailers.new.1939 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "kdegraphics-thumbnailers"

Mon Dec 15 11:48:11 2025 rev:182 rq:1322366 version:25.12.0

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/kdegraphics-thumbnailers/kdegraphics-thumbnailers.changes
        2025-11-08 16:28:15.052434602 +0100
+++ 
/work/SRC/openSUSE:Factory/.kdegraphics-thumbnailers.new.1939/kdegraphics-thumbnailers.changes
      2025-12-15 11:48:57.139660990 +0100
@@ -1,0 +2,20 @@
+Sat Dec  6 11:40:32 UTC 2025 - Christophe Marin <[email protected]>
+
+- Update to 25.12.0
+  * New feature release
+  * For more details please see:
+  * https://kde.org/announcements/gear/25.12.0/
+- No code change since 25.11.80
+
+-------------------------------------------------------------------
+Sat Nov 15 19:56:34 UTC 2025 - Christophe Marin <[email protected]>
+
+- Update to 25.11.80
+  * New feature release
+- Changes since 25.08.3:
+  * Integrate KDE Graphics Thumbnailers into OSS-Fuzz
+  * [BlenderCreator] Handle zstd-compressed blend files and minor cleanup
+  * [BlenderCreator] Fix memory leak by using std::unique_ptr for gzFile
+  * Add .cache to .gitignore
+
+-------------------------------------------------------------------

Old:
----
  kdegraphics-thumbnailers-25.08.3.tar.xz
  kdegraphics-thumbnailers-25.08.3.tar.xz.sig

New:
----
  kdegraphics-thumbnailers-25.12.0.tar.xz
  kdegraphics-thumbnailers-25.12.0.tar.xz.sig

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

Other differences:
------------------
++++++ kdegraphics-thumbnailers.spec ++++++
--- /var/tmp/diff_new_pack.8grYEe/_old  2025-12-15 11:48:58.127702107 +0100
+++ /var/tmp/diff_new_pack.8grYEe/_new  2025-12-15 11:48:58.127702107 +0100
@@ -16,12 +16,12 @@
 #
 
 
-%define kf6_version 6.14.0
-%define qt6_version 6.8.0
+%define kf6_version 6.19.0
+%define qt6_version 6.9.0
 
 %bcond_without released
 Name:           kdegraphics-thumbnailers
-Version:        25.08.3
+Version:        25.12.0
 Release:        0
 Summary:        Graphics file thumbnail generators
 License:        GPL-2.0-or-later AND LGPL-2.1-or-later


++++++ kdegraphics-thumbnailers-25.08.3.tar.xz -> 
kdegraphics-thumbnailers-25.12.0.tar.xz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kdegraphics-thumbnailers-25.08.3/.gitignore 
new/kdegraphics-thumbnailers-25.12.0/.gitignore
--- old/kdegraphics-thumbnailers-25.08.3/.gitignore     2025-09-09 
06:17:15.000000000 +0200
+++ new/kdegraphics-thumbnailers-25.12.0/.gitignore     2025-09-09 
04:00:50.000000000 +0200
@@ -20,3 +20,4 @@
 CMakeLists.txt.user*
 *.unc-backup*
 .cmake/
+.cache/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/kdegraphics-thumbnailers-25.08.3/CMakeLists.txt 
new/kdegraphics-thumbnailers-25.12.0/CMakeLists.txt
--- old/kdegraphics-thumbnailers-25.08.3/CMakeLists.txt 2025-09-09 
06:17:15.000000000 +0200
+++ new/kdegraphics-thumbnailers-25.12.0/CMakeLists.txt 2025-09-09 
04:00:50.000000000 +0200
@@ -23,6 +23,9 @@
 option(DISABLE_BLENDER "Disable the blender thumbnailer." OFF)
 option(DISABLE_MOBIPOCKET "Disable the mobipocket thumbnailer." OFF)
 
+option(BUILD_FUZZERS "Whether to the thumbnail build fuzzers" OFF)
+option(FUZZERS_USE_QT_MINIMAL_INTEGRATION_PLUGIN "Whether to use the Qt 
minimal integration plugin for fuzzers" OFF)
+
 find_package(KExiv2Qt6)
 set_package_properties(KExiv2Qt6    PROPERTIES
                        DESCRIPTION "A library for reading and writing image 
metadata"
@@ -72,6 +75,14 @@
 ecm_optional_add_subdirectory(mobipocket)
 endif()
 
+if(BUILD_FUZZERS)
+    if(BUILD_SHARED_LIBS)
+        message(FATAL_ERROR "Fuzzers can only be built with static libraries")
+    else()
+        add_subdirectory(autotests/ossfuzz)
+    endif()
+endif()
+
 install(FILES org.kde.kdegraphics-thumbnailers.metainfo.xml
         DESTINATION ${KDE_INSTALL_METAINFODIR})
 
Binary files 
old/kdegraphics-thumbnailers-25.08.3/autotests/data/corpus/sample.blend and 
new/kdegraphics-thumbnailers-25.12.0/autotests/data/corpus/sample.blend differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/kdegraphics-thumbnailers-25.08.3/autotests/ossfuzz/CMakeLists.txt 
new/kdegraphics-thumbnailers-25.12.0/autotests/ossfuzz/CMakeLists.txt
--- old/kdegraphics-thumbnailers-25.08.3/autotests/ossfuzz/CMakeLists.txt       
1970-01-01 01:00:00.000000000 +0100
+++ new/kdegraphics-thumbnailers-25.12.0/autotests/ossfuzz/CMakeLists.txt       
2025-09-09 04:00:50.000000000 +0200
@@ -0,0 +1,59 @@
+# SPDX-FileCopyrightText: 2025 Azhar Momin <[email protected]>
+# SPDX-License-Identifier: BSD-2-Clause
+
+if(DEFINED ENV{LIB_FUZZING_ENGINE})
+    set(fuzzing_engine $ENV{LIB_FUZZING_ENGINE})
+else()
+    if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
+        set(fuzzing_engine -fsanitize=fuzzer)
+    else()
+        message(FATAL_ERROR "Fuzzing engine not supported")
+    endif()
+endif()
+
+function(add_thumbnail_fuzzer creator creator_header target_lib)
+    set(gen_src ${CMAKE_CURRENT_BINARY_DIR}/${target_lib}_fuzzer.cc)
+    set(CREATOR "${creator}")
+    set(CREATOR_HEADER "${creator_header}")
+    configure_file(
+        ${CMAKE_CURRENT_SOURCE_DIR}/kde_thumbnailers_fuzzer.cc.in
+        ${gen_src}
+        @ONLY
+    )
+
+    add_executable(${target_lib}_fuzzer
+        ${gen_src}
+    )
+
+    kcoreaddons_target_static_plugins(${target_lib}_fuzzer
+        LINK_OPTION PRIVATE
+        TARGETS ${target_lib}
+    )
+
+    target_link_libraries(${target_lib}_fuzzer
+        PRIVATE
+            ${fuzzing_engine}
+    )
+
+    if(FUZZERS_USE_QT_MINIMAL_INTEGRATION_PLUGIN)
+        qt_import_plugins(${target_lib}_fuzzer INCLUDE 
Qt::QMinimalIntegrationPlugin)
+    endif()
+
+    set_target_properties(${target_lib}_fuzzer PROPERTIES
+        RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin/fuzzers
+    )
+endfunction()
+
+add_thumbnail_fuzzer(GSCreator gscreator.h gsthumbnail)
+
+if(KExiv2Qt6_FOUND AND KDcrawQt6_FOUND)
+    add_thumbnail_fuzzer(RAWCreator rawcreator.h rawthumbnail)
+endif()
+
+if (NOT DISABLE_BLENDER)
+    add_thumbnail_fuzzer(BlenderCreator blendercreator.h blenderthumbnail)
+endif()
+
+if(QMobipocket6_FOUND OR QMobipocket_FOUND)
+    add_thumbnail_fuzzer(MobiThumbnail mobithumbnail.h mobithumbnail)
+endif()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/kdegraphics-thumbnailers-25.08.3/autotests/ossfuzz/build_fuzzers.sh 
new/kdegraphics-thumbnailers-25.12.0/autotests/ossfuzz/build_fuzzers.sh
--- old/kdegraphics-thumbnailers-25.08.3/autotests/ossfuzz/build_fuzzers.sh     
1970-01-01 01:00:00.000000000 +0100
+++ new/kdegraphics-thumbnailers-25.12.0/autotests/ossfuzz/build_fuzzers.sh     
2025-09-09 04:00:50.000000000 +0200
@@ -0,0 +1,97 @@
+#!/bin/bash -eu
+#
+# SPDX-FileCopyrightText: 2025 Azhar Momin <[email protected]>
+# SPDX-License-Identifier: LGPL-2.0-or-later
+#
+# This script must be run after 
kio-extras/thumbnail/autotests/ossfuzz/build_fuzzers.sh
+
+export PATH="$WORK/bin:$WORK/libexec:$PATH"
+export PKG_CONFIG="$(which pkg-config) --static"
+export 
PKG_CONFIG_PATH="$WORK/lib/pkgconfig:$WORK/share/pkgconfig:$WORK/lib/x86_64-linux-gnu/pkgconfig"
+
+# For MobiThumbnail
+cd $SRC/kdegraphics-mobipocket
+sed -i '/add_subdirectory(tools)/d' CMakeLists.txt
+cmake . -G Ninja \
+  -DBUILD_SHARED_LIBS=OFF \
+  -DBUILD_TESTING=OFF \
+  -DCMAKE_INSTALL_PREFIX=$WORK
+ninja install -j$(nproc)
+
+# For GSCreator
+
+CFLAGS_SAVE="$CFLAGS"
+CXXFLAGS_SAVE="$CXXFLAGS"
+PKG_CONFIG_PATH_SAVE="$PKG_CONFIG_PATH"
+
+export CFLAGS="-O1 -fno-omit-frame-pointer -gline-tables-only 
-Wno-error=implicit-function-declaration 
-DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION"
+export CXXFLAGS="-O1 -fno-omit-frame-pointer -gline-tables-only 
-Wno-error=implicit-function-declaration 
-DFUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION $CXXFLAGS_EXTRA"
+unset PKG_CONFIG_PATH
+
+# Build gs binary
+cd $SRC/ghostpdl
+./autogen.sh
+make -j$(nproc)
+cp bin/gs $OUT
+
+# Build dvips binary
+cd $SRC/texlive-source/texk/kpathsea
+./configure --disable-shared --enable-static
+make -j$(nproc)
+
+cd $SRC/texlive-source/texk/dvipsk
+./configure --disable-shared --enable-static
+make -j$(nproc)
+cp dvips $OUT
+
+export CFLAGS="$CFLAGS_SAVE"
+export CXXFLAGS="$CXXFLAGS_SAVE"
+export PKG_CONFIG_PATH="$PKG_CONFIG_PATH_SAVE"
+
+# For RAWCreator
+cd $SRC/LibRaw
+CFLAGS_SAVE=$CFLAGS
+CXXFLAGS_SAVE=$CXXFLAGS
+CFLAGS="$CFLAGS -fno-sanitize=function,vptr"
+CXXFLAGS="$CXXFLAGS -fno-sanitize=function,vptr"
+autoreconf --install
+./configure --disable-examples --disable-shared --enable-static
+make -j$(nproc)
+make install -j$(nproc)
+CFLAGS=$CFLAGS_SAVE
+CXXFLAGS=$CXXFLAGS_SAVE
+
+cd $SRC/libkdcraw
+cmake . -G Ninja \
+    -DCMAKE_INSTALL_PREFIX=$WORK \
+    -DBUILD_SHARED_LIBS=OFF \
+    -DBUILD_TESTING=OFF \
+    -DQT_MAJOR_VERSION=6
+ninja install -j$(nproc)
+# This is later required for building kdegraphics-thumbnailers
+# Ideally we should be passing CMAKE_MODULE_PATH but for some reason that 
doesn't work
+cp cmake/modules/FindLibRaw.cmake $WORK/share/ECM/find-modules/
+
+cd $SRC/kdegraphics-thumbnailers
+cmake -B build -G Ninja \
+    -DCMAKE_PREFIX_PATH=$WORK \
+    -DCMAKE_INSTALL_PREFIX=$WORK \
+    -DBUILD_FUZZERS=ON \
+    -DFUZZERS_USE_QT_MINIMAL_INTEGRATION_PLUGIN=ON \
+    -DBUILD_SHARED_LIBS=OFF
+ninja -C build -j$(nproc)
+
+EXTENSIONS="blenderthumbnail_fuzzer blend
+            mobithumbnail_fuzzer mobi
+            gsthumbnail_fuzzer dvi ps pdf eps
+            rawthumbnail_fuzzer cr2 cr3 nef nrw arw srf orf rw2 raf dng pef 
srw kdc erf"
+
+echo "$EXTENSIONS" | while read fuzzer_name extensions; do
+    # copy the fuzzer binary
+    cp build/bin/fuzzers/$fuzzer_name $OUT
+
+    # create seed corpus
+    for extension in $extensions; do
+        find . -name "*.$extension" -exec zip -q 
"$OUT/${fuzzer_name}_seed_corpus.zip" {} +
+    done
+done
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/kdegraphics-thumbnailers-25.08.3/autotests/ossfuzz/kde_thumbnailers_fuzzer.cc.in
 
new/kdegraphics-thumbnailers-25.12.0/autotests/ossfuzz/kde_thumbnailers_fuzzer.cc.in
--- 
old/kdegraphics-thumbnailers-25.08.3/autotests/ossfuzz/kde_thumbnailers_fuzzer.cc.in
        1970-01-01 01:00:00.000000000 +0100
+++ 
new/kdegraphics-thumbnailers-25.12.0/autotests/ossfuzz/kde_thumbnailers_fuzzer.cc.in
        2025-09-09 04:00:50.000000000 +0200
@@ -0,0 +1,53 @@
+/*
+ * SPDX-FileCopyrightText: 2025 Azhar Momin <[email protected]>
+ * SPDX-License-Identifier: LGPL-2.0-or-later
+ */
+
+#include <QByteArray>
+#include <QGuiApplication>
+#include <QMimeDatabase>
+#include <QSize>
+#include <QTemporaryFile>
+#include <QUrl>
+#include <QVariant>
+
+#include "@CREATOR_HEADER@"
+
+static void runThumbnailer(const QString &fileName, const QString &mimetype)
+{
+    QSize targetSize(128, 128);
+    qreal dpr = 1.0;
+    float sequenceIndex = 0.0f;
+
+    KIO::ThumbnailRequest request(QUrl::fromLocalFile(fileName), targetSize, 
mimetype, dpr, sequenceIndex);
+
+    @CREATOR@ thumbnailer(nullptr, {});
+    thumbnailer.create(request);
+}
+
+extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
+{
+    int argc = 0;
+    QGuiApplication app(argc, nullptr);
+
+    QByteArray b(reinterpret_cast<const char *>(data), static_cast<int>(size));
+
+    QTemporaryFile f;
+    if (!f.open()) {
+        return 0;
+    }
+    f.write(b);
+    f.close();
+
+    QMimeDatabase mimeDb;
+    QMimeType mimetype = mimeDb.mimeTypeForData(b);
+
+    runThumbnailer(f.fileName(), mimetype.name());
+    for (const QString &ancestor : mimetype.allAncestors()) {
+        if (ancestor != QLatin1String("application/octet-stream")) {
+            runThumbnailer(f.fileName(), ancestor);
+        }
+    }
+
+    return 0;
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/kdegraphics-thumbnailers-25.08.3/autotests/ossfuzz/prepare_build.sh 
new/kdegraphics-thumbnailers-25.12.0/autotests/ossfuzz/prepare_build.sh
--- old/kdegraphics-thumbnailers-25.08.3/autotests/ossfuzz/prepare_build.sh     
1970-01-01 01:00:00.000000000 +0100
+++ new/kdegraphics-thumbnailers-25.12.0/autotests/ossfuzz/prepare_build.sh     
2025-09-09 04:00:50.000000000 +0200
@@ -0,0 +1,13 @@
+#!/bin/bash -eu
+#
+# SPDX-FileCopyrightText: 2025 Azhar Momin <[email protected]>
+# SPDX-License-Identifier: LGPL-2.0-or-later
+
+# For MobiCreator
+git clone --depth 1 https://invent.kde.org/graphics/kdegraphics-mobipocket.git
+# For GSCreator
+git clone --depth 1 https://github.com/ArtifexSoftware/ghostpdl.git
+git clone --depth 1 https://github.com/TeX-Live/texlive-source.git
+# For RAWCreator
+git clone --depth 1 https://github.com/LibRaw/LibRaw.git
+git clone --depth 1 https://invent.kde.org/graphics/libkdcraw.git
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/kdegraphics-thumbnailers-25.08.3/blend/blendercreator.cpp 
new/kdegraphics-thumbnailers-25.12.0/blend/blendercreator.cpp
--- old/kdegraphics-thumbnailers-25.08.3/blend/blendercreator.cpp       
2025-09-09 06:17:15.000000000 +0200
+++ new/kdegraphics-thumbnailers-25.12.0/blend/blendercreator.cpp       
2025-09-09 04:00:50.000000000 +0200
@@ -27,25 +27,41 @@
 
 KIO::ThumbnailResult BlenderCreator::create(const KIO::ThumbnailRequest 
&request)
 {
-    QFile file (request.url().toLocalFile());
-    if(!file.open(QIODevice::ReadOnly)) {
+    std::unique_ptr<QIODevice> device = 
std::make_unique<QFile>(request.url().toLocalFile());
+    if(!device->open(QIODevice::ReadOnly)) {
         return KIO::ThumbnailResult::fail();
     }
 
-    QDataStream blendStream;
-    blendStream.setDevice(&file);
-    // Blender has an option to save files with gzip compression. First check 
if we are dealing with such files.
-    std::unique_ptr<KCompressionDevice> gzFile;
-    if(file.peek(2).startsWith("\x1F\x8B")) { // gzip magic (each gzip member 
starts with ID1(0x1f) and ID2(0x8b))
-        file.close();
-        gzFile = 
std::make_unique<KCompressionDevice>(request.url().toLocalFile(), 
KCompressionDevice::GZip);
-        if (gzFile->open(QIODevice::ReadOnly)) {
-            blendStream.setDevice(gzFile.get());
-        } else {
-            return KIO::ThumbnailResult::fail();
+    // Blender has an option to save files with zstd or gzip compression. 
First check if we are dealing with such files.
+    QByteArray header = device->peek(4);
+    if (header.size() == 4) {
+        const uint8_t *h = reinterpret_cast<const uint8_t 
*>(header.constData());
+        uint32_t magic = h[0] | (h[1] << 8) | (h[2] << 16) | (h[3] << 24);
+        // A zstd archive may start with a regular or skippable frame
+        // - 0xFD2FB528 is the magic number for zstd regular frame
+        // - 0x184D2A5 is used to detect skippable frames by checking the top 
28 bits (ignoring the lower 4 bits)
+        //   skippable frame magic values are in the range 
0x184D2A50..0x184D2A5F, so shifting right by 4 masks them all
+        //   see:
+        // - 
https://github.com/facebook/zstd/blob/dev/doc/zstd_compression_format.md#zstandard-frames
+        // - 
https://github.com/facebook/zstd/blob/dev/doc/zstd_compression_format.md#skippable-frames
+        if (magic == 0xFD2FB528 || (magic >> 4) == 0x184D2A5) {
+            device = std::make_unique<KCompressionDevice>(std::move(device), 
KCompressionDevice::Zstd);
+            if (!device->open(QIODevice::ReadOnly)) {
+                return KIO::ThumbnailResult::fail();
+            }
+        }
+        // In earlier versions of Blender, files were compressed using gzip.
+        else if (header.startsWith("\x1F\x8B")) { // gzip magic (each gzip 
member starts with ID1(0x1f) and ID2(0x8b))
+            device = std::make_unique<KCompressionDevice>(std::move(device), 
KCompressionDevice::GZip);
+            if (!device->open(QIODevice::ReadOnly)) {
+                return KIO::ThumbnailResult::fail();
+            }
         }
     }
 
+    QDataStream blendStream;
+    blendStream.setDevice(device.get());
+
     // First to check is file header.
     // BLEND file header format
     // Reference      Content                                     Size
@@ -59,7 +75,6 @@
     QByteArray head(12, '\0');
     blendStream.readRawData(head.data(), 12);
     if(!head.startsWith("BLENDER") || head.right(3).toInt() < 250 /*blender 
pre 2.5 had no thumbs*/) {
-        blendStream.device()->close();
         return KIO::ThumbnailResult::fail();
     }
 
@@ -97,7 +112,6 @@
     }
 
     if(!fileBlockHeader.startsWith("TEST")) {
-        blendStream.device()->close();
         return KIO::ThumbnailResult::fail();
     }
 
@@ -109,7 +123,6 @@
 
     qint32 imgSize = fileBlockSize - 8;
     if (imgSize != x * y * 4) {
-        blendStream.device()->close();
         return KIO::ThumbnailResult::fail();
     }
 
@@ -126,7 +139,6 @@
     thumbnail = thumbnail.mirrored();
     QImage img = 
thumbnail.convertToFormat(QImage::Format_ARGB32_Premultiplied);
 
-    blendStream.device()->close();
     return !img.isNull() ? KIO::ThumbnailResult::pass(img) : 
KIO::ThumbnailResult::fail();
 }
 

Reply via email to