diff options
author | Jason A. Donenfeld <Jason@zx2c4.com> | 2020-01-04 14:46:27 +0100 |
---|---|---|
committer | Jason A. Donenfeld <Jason@zx2c4.com> | 2020-01-04 15:07:10 +0100 |
commit | 1d2d6200b8ff517db0f7530645180df3cc4afa74 (patch) | |
tree | d8369e0b9211ec3c93d044cfb323e363bdd6029b /src/fuzz | |
parent | Makefile: add standard 'all' target (diff) | |
download | wireguard-tools-1d2d6200b8ff517db0f7530645180df3cc4afa74.tar.xz wireguard-tools-1d2d6200b8ff517db0f7530645180df3cc4afa74.zip |
ipc: simplify inflatable buffer and add fuzzer
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'src/fuzz')
-rw-r--r-- | src/fuzz/Makefile | 9 | ||||
-rw-r--r-- | src/fuzz/config.c | 2 | ||||
-rw-r--r-- | src/fuzz/stringlist.c | 59 | ||||
-rw-r--r-- | src/fuzz/uapi.c | 2 |
4 files changed, 67 insertions, 5 deletions
diff --git a/src/fuzz/Makefile b/src/fuzz/Makefile index 98a16dd..3fb2970 100644 --- a/src/fuzz/Makefile +++ b/src/fuzz/Makefile @@ -2,10 +2,10 @@ # # Copyright (C) 2018-2020 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved. -all: config uapi +all: config uapi stringlist CFLAGS ?= -O3 -march=native -g -CFLAGS += -fsanitize=fuzzer -std=gnu11 -idirafter ../uapi +CFLAGS += -fsanitize=fuzzer -fsanitize=address -std=gnu11 -idirafter ../uapi CC := clang config: config.c ../config.c ../encoding.c @@ -14,7 +14,10 @@ config: config.c ../config.c ../encoding.c uapi: uapi.c ../ipc.c ../curve25519.c ../encoding.c $(CC) $(CFLAGS) -o $@ $< +stringlist: stringlist.c ../ipc.c ../curve25519.c ../encoding.c + $(CC) $(CFLAGS) -o $@ $< + clean: - rm -f config uapi + rm -f config uapi stringlist .PHONY: all clean diff --git a/src/fuzz/config.c b/src/fuzz/config.c index 49c87b4..5812b4c 100644 --- a/src/fuzz/config.c +++ b/src/fuzz/config.c @@ -18,7 +18,7 @@ const char *__asan_default_options() { - return "verbosity=1"; + return "verbosity=1"; } int LLVMFuzzerTestOneInput(const uint8_t *data, size_t len) diff --git a/src/fuzz/stringlist.c b/src/fuzz/stringlist.c new file mode 100644 index 0000000..85f7330 --- /dev/null +++ b/src/fuzz/stringlist.c @@ -0,0 +1,59 @@ +// SPDX-License-Identifier: GPL-2.0 +/* + * Copyright (C) 2018-2020 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved. + */ + +#define RUNSTATEDIR "/var/empty" +#undef __linux__ +#include "../ipc.c" +#include "../curve25519.c" +#include "../encoding.c" + +#include <stdint.h> +#include <string.h> +#include <stdlib.h> +#include <stdio.h> +#include <assert.h> + +const char *__asan_default_options() +{ + return "verbosity=1"; +} + +int LLVMFuzzerTestOneInput(const uint8_t *data, size_t data_len) +{ + struct string_list list = { 0 }; + char *interfaces; + + if (!data_len) + return 0; + + interfaces = malloc(data_len); + assert(interfaces); + memcpy(interfaces, data, data_len); + interfaces[data_len - 1] = '\0'; + + for (char *interface = interfaces; interface - interfaces < data_len; interface += strlen(interface) + 1) + assert(string_list_add(&list, interface) == 0); + + for (char *interface = interfaces, *interface2 = list.buffer;;) { + size_t len; + + if (interface - interfaces >= data_len) { + assert(!interface2 || !strlen(interface2)); + break; + } + len = strlen(interface); + if (!len) { + ++interface; + continue; + } + assert(strlen(interface2) == len); + assert(!memcmp(interface, interface2, len + 1)); + interface += len + 1; + interface2 += len + 1; + } + free(list.buffer); + free(interfaces); + return 0; +} diff --git a/src/fuzz/uapi.c b/src/fuzz/uapi.c index 90b2ba6..a387125 100644 --- a/src/fuzz/uapi.c +++ b/src/fuzz/uapi.c @@ -20,7 +20,7 @@ static FILE *hacked_userspace_interface_file(const char *iface); const char *__asan_default_options() { - return "verbosity=1"; + return "verbosity=1"; } union hackiface { |