// SPDX-License-Identifier: GPL-2.0 /* * Copyright (C) 2018-2020 Jason A. Donenfeld . All Rights Reserved. */ #include #include #include #include const char *__asan_default_options() { return "verbosity=1"; } int wg_main(int argc, char *argv[]); static FILE *devnull; int LLVMFuzzerTestOneInput(const char *data, size_t data_len) { char *argv[8192] = { 0 }, *args; size_t argc = 0; FILE *fake_stdin = NULL; if (!devnull) { assert((devnull = fopen("/dev/null", "r+"))); stdin = stdout = stderr = devnull; } assert((args = malloc(data_len))); memcpy(args, data, data_len); if (data_len) args[data_len - 1] = '\0'; for (const char *arg = args; argc < 8192 && arg - args < data_len; arg += strlen(arg) + 1) { if (arg[0]) assert((argv[argc++] = strdup(arg))); } if (!argc) assert((argv[argc++] = strdup("no argv[0]!"))); if (argc > 2 && (!strcmp(argv[1], "show") || !strcmp(argv[1], "showconf") || !strcmp(argv[1], "set") || !strcmp(argv[1], "setconf") || !strcmp(argv[1], "addconf") || !strcmp(argv[1], "syncconf"))) { free(argv[2]); assert((argv[2] = strdup("wg0"))); } if (argc >= 2 && !strcmp(argv[1], "pubkey")) { char *arg; size_t len; for (size_t i = 2; i < argc; ++i) free(argv[i]); argc = 2; arg = args; for (; !arg[0]; ++arg); arg += strlen(arg) + 1; for (; !arg[0]; ++arg); arg += strlen(arg) + 1; len = data_len - (arg - args); if (len <= 1) goto done; assert((fake_stdin = fmemopen(arg, len - 1, "r"))); stdin = fake_stdin; } wg_main(argc, argv); done: for (size_t i = 0; i < argc; ++i) free(argv[i]); free(args); if (fake_stdin) fclose(fake_stdin); return 0; }