Revision control

+ // Copyright (C) 2026 The Qt Company Ltd.
+ // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
+
+ #include <QGuiApplication>
+ #include <QtGlobal>
+ #include <QTemporaryFile>
+ #include <QQmlEngine>
+ #include <QQuickWindow>
+ #include <QtQuickVectorImage/private/qquickvectorimage_p.h>
+
+ // silence warnings
+ static QtMessageHandler mh = qInstallMessageHandler([](QtMsgType, const QMessageLogContext &,
+ const QString &) {});
+
+ // Driver may allocate caches or other persistent state, which we need to suppress.
+ // Add any false positive leaks here.
+ extern "C" const char *__lsan_default_suppressions()
+ {
+ return "leak:libgallium\n"
+ "leak:swrast\n"
+ "leak:libGLX\n"
+ "leak:libEGL\n"
+ "leak:libglapi\n"
+ "leak:swiftshader\n"
+ "leak:libvulkan\n";
+ }
+
+ extern "C" int LLVMFuzzerInitialize(int *_argc, char ***_argv)
+ {
+ Q_UNUSED(_argc);
+ Q_UNUSED(_argv);
+
+ QHashSeed::setDeterministicGlobalSeed();
+ static int argc = 1;
+ static char arg1[] = "fuzzer";
+ static char *argv[] = {arg1, nullptr};
+
+ static QGuiApplication *qga = new QGuiApplication(argc, argv);
+ Q_UNUSED(qga);
+
+ return 0;
+ }
+
+ extern "C" int LLVMFuzzerTestOneInput(const char *Data, size_t Size)
+ {
+ // ### QQuickVectorImage cannot load from a QByteArray yet, so pass the data via a file
+ QTemporaryFile jsonFile;
+ if (!jsonFile.open())
+ return 0;
+ jsonFile.write(Data, qint64(Size));
+ if (!jsonFile.flush())
+ return 0;
+
+ QQuickWindow window;
+ window.resize(512, 512);
+ window.create();
+
+ QQmlEngine engine;
+ QQuickVectorImage vectorImage;
+ QQmlEngine::setContextForObject(&vectorImage, engine.rootContext());
+ vectorImage.setParentItem(window.contentItem());
+ vectorImage.setSize(window.size());
+ vectorImage.setAssumeTrustedSource(true);
+ vectorImage.setSource(QUrl::fromLocalFile(jsonFile.fileName()));
+
+ window.grabWindow(); // renders one frame
+
+ QCoreApplication::sendPostedEvents(nullptr, QEvent::DeferredDelete);
+ return 0;
+ }