]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-json: Add fuzz target for parsing JSON tree from istream
authorStephan Bosch <stephan.bosch@open-xchange.com>
Fri, 16 Oct 2020 11:35:18 +0000 (13:35 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Sat, 18 Nov 2023 18:58:04 +0000 (18:58 +0000)
src/lib-json/Makefile.am
src/lib-json/fuzz-json-istream.c [new file with mode: 0644]

index 2dac5aa022051a355f5ff44c2f166a97088454f0..661a88e74f3a93e41d056c6bf2a1d227a119bb9c 100644 (file)
@@ -36,7 +36,14 @@ test_programs = \
        test-json-tree \
        test-json-tree-io
 
-noinst_PROGRAMS = json-format $(test_programs)
+fuzz_programs =
+
+if USE_FUZZER
+fuzz_programs += \
+        fuzz-json-istream
+endif
+
+noinst_PROGRAMS = json-format $(test_programs) $(fuzz_programs)
 
 json_format_SOURCE = \
        json-format.c
@@ -110,6 +117,18 @@ test_json_tree_io_DEPENDENCIES = \
 pkginc_libdir=$(pkgincludedir)
 pkginc_lib_HEADERS = $(headers)
 
+nodist_EXTRA_fuzz_json_istream_SOURCES = force-cxx-linking.cxx
+fuzz_json_istream_CPPFLAGS = \
+       $(FUZZER_CPPFLAGS)
+fuzz_json_istream_LDFLAGS = \
+       $(FUZZER_LDFLAGS)
+fuzz_json_istream_SOURCES = \
+       fuzz-json-istream.c
+fuzz_json_istream_LDADD = \
+       $(test_libs)
+fuzz_json_istream_DEPENDENCIES = \
+       $(test_deps)
+
 check: check-am check-test
 check-test: all-am
        for bin in $(test_programs); do \
diff --git a/src/lib-json/fuzz-json-istream.c b/src/lib-json/fuzz-json-istream.c
new file mode 100644 (file)
index 0000000..a9ec202
--- /dev/null
@@ -0,0 +1,36 @@
+/* Copyright (c) 2023 Dovecot authors, see the included COPYING file */
+
+#include "lib.h"
+#include "istream.h"
+#include "test-common.h"
+#include "test-common.h"
+#include "fuzzer.h"
+
+#include "json-types.h"
+#include "json-parser.h"
+#include "json-istream.h"
+
+FUZZ_BEGIN_DATA(const unsigned char *data, size_t size)
+{
+       struct istream *input;
+       struct json_limits limits = {
+               .max_name_size = 1024U,
+               .max_string_size = 1024U,
+               .max_nesting = 10U,
+               .max_list_items = JSON_DEFAULT_MAX_LIST_ITEMS,
+       };
+       struct json_tree *tree = NULL;
+       struct json_istream *jinput;
+       int ret;
+
+       input = test_istream_create_data(data, size);
+       jinput = json_istream_create(input, JSON_ISTREAM_TYPE_NORMAL, &limits,
+                                    JSON_PARSER_FLAG_STRICT);
+       ret = json_istream_read_tree(jinput, &tree);
+       i_assert(ret < 1 || tree != NULL);
+       if (tree != NULL)
+               json_tree_unref(&tree);
+       json_istream_unref(&jinput);
+       i_stream_unref(&input);
+}
+FUZZ_END