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();
}