From f4b08721f7756d8fa361ea4e691aea08b49458b1 Mon Sep 17 00:00:00 2001 From: Edward Hervey Date: Wed, 6 Dec 2017 08:41:59 +0100 Subject: [PATCH] fuzzing: Add local fuzz runner Allows testing without full oss-fuzz infrastructure --- fuzzing/gst-discoverer.c | 6 +++- fuzzing/localfuzzer.c | 78 ++++++++++++++++++++++++++++++++++++++++ fuzzing/typefind.c | 4 +++ 3 files changed, 87 insertions(+), 1 deletion(-) create mode 100644 fuzzing/localfuzzer.c diff --git a/fuzzing/gst-discoverer.c b/fuzzing/gst-discoverer.c index 519537a61b..17c91590b9 100644 --- a/fuzzing/gst-discoverer.c +++ b/fuzzing/gst-discoverer.c @@ -27,6 +27,7 @@ #include #include +#ifndef LOCAL_FUZZ_BUILD GST_PLUGIN_STATIC_DECLARE(coreelements); GST_PLUGIN_STATIC_DECLARE(playback); GST_PLUGIN_STATIC_DECLARE(typefindfunctions); @@ -34,6 +35,7 @@ GST_PLUGIN_STATIC_DECLARE(app); GST_PLUGIN_STATIC_DECLARE(ogg); GST_PLUGIN_STATIC_DECLARE(theora); GST_PLUGIN_STATIC_DECLARE(vorbis); +#endif /* push-based discoverer fuzzing target * @@ -97,7 +99,8 @@ int LLVMFuzzerTestOneInput(const guint8 *data, size_t size) /* Only initialize and register plugins once */ gst_init (NULL, NULL); - + +#ifndef LOCAL_FUZZ_BUILD GST_PLUGIN_STATIC_REGISTER(coreelements); GST_PLUGIN_STATIC_REGISTER(playback); GST_PLUGIN_STATIC_REGISTER(typefindfunctions); @@ -105,6 +108,7 @@ int LLVMFuzzerTestOneInput(const guint8 *data, size_t size) GST_PLUGIN_STATIC_REGISTER(ogg); GST_PLUGIN_STATIC_REGISTER(theora); GST_PLUGIN_STATIC_REGISTER(vorbis); +#endif initialized = TRUE; } diff --git a/fuzzing/localfuzzer.c b/fuzzing/localfuzzer.c new file mode 100644 index 0000000000..188d2461a8 --- /dev/null +++ b/fuzzing/localfuzzer.c @@ -0,0 +1,78 @@ +/* GStreamer + * Copyright (C) 2017 Edward Hervey + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301, USA. + */ + +/* Local fuzzer runner */ +#include + +extern int LLVMFuzzerTestOneInput (const guint8 * data, size_t size); + +static void +test_file (gchar * filename) +{ + GDir *dir; + gchar *path; + gchar *contents; + gsize length; + + /* if filename is a directory, process the contents */ + if ((dir = g_dir_open (filename, 0, NULL))) { + const gchar *entry; + + while ((entry = g_dir_read_name (dir))) { + gchar *spath; + + spath = g_strconcat (filename, G_DIR_SEPARATOR_S, entry, NULL); + test_file (spath); + g_free (spath); + } + + g_dir_close (dir); + return; + } + + /* Make sure path is absolute */ + if (!g_path_is_absolute (filename)) { + gchar *curdir; + + curdir = g_get_current_dir (); + path = g_build_filename (curdir, filename, NULL); + g_free (curdir); + } else + path = g_strdup (filename); + + /* Check if path exists */ + if (g_file_get_contents (path, &contents, &length, NULL)) { + g_print (">>> %s (%" G_GSIZE_FORMAT " bytes)\n", path, length); + LLVMFuzzerTestOneInput ((const guint8 *) contents, length); + g_free (contents); + } + + g_free (path); +} + +int +main (int argc, gchar ** argv) +{ + gint i; + + for (i = 1; i < argc; i++) + test_file (argv[i]); + + return 0; +} diff --git a/fuzzing/typefind.c b/fuzzing/typefind.c index 16615ef130..3d5d14cfec 100644 --- a/fuzzing/typefind.c +++ b/fuzzing/typefind.c @@ -26,9 +26,11 @@ #include #include +#ifndef LOCAL_FUZZ_BUILD GST_PLUGIN_STATIC_DECLARE (coreelements); GST_PLUGIN_STATIC_DECLARE (typefindfunctions); GST_PLUGIN_STATIC_DECLARE (app); +#endif /* push-based typefind fuzzing target * @@ -73,9 +75,11 @@ LLVMFuzzerTestOneInput (const guint8 * data, size_t size) /* Only initialize and register plugins once */ gst_init (NULL, NULL); +#ifndef LOCAL_FUZZ_BUILD GST_PLUGIN_STATIC_REGISTER (coreelements); GST_PLUGIN_STATIC_REGISTER (typefindfunctions); GST_PLUGIN_STATIC_REGISTER (app); +#endif initialized = TRUE; }