From 28e4a8421ca618097bf8de35dab17ffbd423e468 Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Thu, 15 Nov 2018 16:38:12 +0100 Subject: Fuzzing: Add a test for QDateTime::fromString This patch adds a basic fuzzing test for QDateTime::fromString. Task-number: QTBUG-87104 Pick-to: 5.15 Change-Id: Icc51386f06f6d4d2a4495734f7fa45de80c6e065 Reviewed-by: Robert Loehning --- .../time/qdatetime/fromstring/fromstring.pro | 10 +++ .../corelib/time/qdatetime/fromstring/main.cpp | 100 +++++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 tests/libfuzzer/corelib/time/qdatetime/fromstring/fromstring.pro create mode 100644 tests/libfuzzer/corelib/time/qdatetime/fromstring/main.cpp (limited to 'tests/libfuzzer') diff --git a/tests/libfuzzer/corelib/time/qdatetime/fromstring/fromstring.pro b/tests/libfuzzer/corelib/time/qdatetime/fromstring/fromstring.pro new file mode 100644 index 0000000000..631fcd71e4 --- /dev/null +++ b/tests/libfuzzer/corelib/time/qdatetime/fromstring/fromstring.pro @@ -0,0 +1,10 @@ +QT -= gui +CONFIG -= app_bundle +CONFIG += console +SOURCES += main.cpp +FUZZ_ENGINE = $$(LIB_FUZZING_ENGINE) +isEmpty(FUZZ_ENGINE) { + QMAKE_LFLAGS += -fsanitize=fuzzer +} else { + LIBS += $$FUZZ_ENGINE +} diff --git a/tests/libfuzzer/corelib/time/qdatetime/fromstring/main.cpp b/tests/libfuzzer/corelib/time/qdatetime/fromstring/main.cpp new file mode 100644 index 0000000000..e41301bb55 --- /dev/null +++ b/tests/libfuzzer/corelib/time/qdatetime/fromstring/main.cpp @@ -0,0 +1,100 @@ +/**************************************************************************** +** +** Copyright (C) 2020 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:GPL-EXCEPT$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include + +static const QString formats[] = { + QStringLiteral("h"), + QStringLiteral("hh"), + QStringLiteral("H"), + QStringLiteral("HH"), + QStringLiteral("m"), + QStringLiteral("mm"), + QStringLiteral("s"), + QStringLiteral("ss"), + QStringLiteral("z"), + QStringLiteral("zzz"), + QStringLiteral("A"), + QStringLiteral("t"), + QStringLiteral("M/d/yyyy"), + QStringLiteral("M/d/yyyy hh:mm"), + QStringLiteral("M/d/yyyy hh:mm A"), + QStringLiteral("M/d/yyyy, hh:mm"), + QStringLiteral("M/d/yyyy, hh:mm A"), + QStringLiteral("MMM d yyyy"), + QStringLiteral("MMM d yyyy hh:mm"), + QStringLiteral("MMM d yyyy hh:mm:ss"), + QStringLiteral("MMM d yyyy, hh:mm"), + QStringLiteral("MMM d yyyy, hh:mm:ss"), + QStringLiteral("MMMM d yyyy"), + QStringLiteral("MMMM d yyyy hh:mm"), + QStringLiteral("MMMM d yyyy hh:mm:ss"), + QStringLiteral("MMMM d yyyy, hh:mm"), + QStringLiteral("MMMM d yyyy, hh:mm:ss"), + QStringLiteral("MMMM d yyyy, hh:mm:ss t"), + QStringLiteral("MMM d, yyyy"), + QStringLiteral("MMM d, yyyy hh:mm"), + QStringLiteral("MMM d, yyyy hh:mm:ss"), + QStringLiteral("MMMM d, yyyy"), + QStringLiteral("MMMM d, yyyy hh:mm"), + QStringLiteral("MMMM d, yyyy hh:mm:ss"), + QStringLiteral("MMMM d, yyyy hh:mm:ss t"), + QStringLiteral("d MMM yyyy"), + QStringLiteral("d MMM yyyy hh:mm"), + QStringLiteral("d MMM yyyy hh:mm:ss"), + QStringLiteral("d MMM yyyy, hh:mm"), + QStringLiteral("d MMM yyyy, hh:mm:ss"), + QStringLiteral("d MMMM yyyy"), + QStringLiteral("d MMMM yyyy hh:mm"), + QStringLiteral("d MMMM yyyy hh:mm:ss"), + QStringLiteral("d MMMM yyyy, hh:mm"), + QStringLiteral("d MMMM yyyy, hh:mm:ss"), + QStringLiteral("d MMM, yyyy"), + QStringLiteral("d MMM, yyyy hh:mm"), + QStringLiteral("d MMM, yyyy hh:mm:ss"), + QStringLiteral("d MMMM, yyyy"), + QStringLiteral("d MMMM, yyyy hh:mm"), + QStringLiteral("d MMMM, yyyy hh:mm:ss"), + QStringLiteral("yyyy-MM-ddThh:mm:ss.zt"), +}; + +// libFuzzer entry-point for testing QDateTimeParser +extern "C" int LLVMFuzzerTestOneInput(const char *Data, size_t Size) +{ + const QString userString = QString::fromUtf8(Data, Size); + + QDateTime::fromString(userString, Qt::TextDate); + QDateTime::fromString(userString, Qt::ISODate); + QDateTime::fromString(userString, Qt::RFC2822Date); + QDateTime::fromString(userString, Qt::ISODateWithMs); + + for (const auto &format : formats) { + QDateTime::fromString(userString, format); + } + return 0; +} -- cgit v1.2.3