]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-mail: Add fuzz-message-parser
authorAki Tuomi <aki.tuomi@open-xchange.com>
Fri, 11 Sep 2020 12:02:57 +0000 (15:02 +0300)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Fri, 8 Jan 2021 14:53:44 +0000 (14:53 +0000)
Fuzzer for message parser

src/lib-mail/Makefile.am
src/lib-mail/fuzz-message-parser.c [new file with mode: 0644]

index f260694f18c6a54858d1eb851762f47bac45b18e..67bb1cc15aa453947b51897567af799a9a21da63 100644 (file)
@@ -115,7 +115,22 @@ test_programs = \
        test-rfc2231-parser \
        test-rfc822-parser
 
-noinst_PROGRAMS = $(test_programs)
+fuzz_programs =
+
+if USE_FUZZER
+fuzz_programs += fuzz-message-parser
+
+nodist_EXTRA_fuzz_message_parser_SOURCES = force-cxx-linking.cxx
+
+fuzz_message_parser_CPPFLAGS = $(FUZZER_CPPFLAGS)
+fuzz_message_parser_LDFLAGS = $(FUZZER_LDFLAGS)
+fuzz_message_parser_SOURCES = fuzz-message-parser.c
+fuzz_message_parser_LDADD = $(test_libs)
+fuzz_message_parser_DEPENDENCIES = $(test_deps)
+
+endif
+
+noinst_PROGRAMS = $(fuzz_programs) $(test_programs)
 
 test_libs = \
        $(noinst_LTLIBRARIES) \
diff --git a/src/lib-mail/fuzz-message-parser.c b/src/lib-mail/fuzz-message-parser.c
new file mode 100644 (file)
index 0000000..1cb4bdc
--- /dev/null
@@ -0,0 +1,28 @@
+/* Copyright (c) 2020 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 "message-parser.h"
+
+FUZZ_BEGIN_DATA(const unsigned char *data, size_t size)
+{
+       struct istream *input = test_istream_create_data(data, size);
+       const struct message_parser_settings set = {
+               .hdr_flags = 0,
+               .flags = MESSAGE_PARSER_FLAG_INCLUDE_MULTIPART_BLOCKS,
+               .max_nested_mime_parts = 0,
+               .max_total_mime_parts = 0,
+       };
+       struct message_parser_ctx *ctx =
+                       message_parser_init(pool_datastack_create(), input, &set);
+       struct message_block block ATTR_UNUSED;
+       i_zero(&block);
+       while(message_parser_parse_next_block(ctx, &block) > -1);
+       struct message_part *part ATTR_UNUSED;
+       message_parser_deinit(&ctx, &part);
+       i_stream_unref(&input);
+}
+FUZZ_END