From ae6636a28facf19db6b146a4f8a93908de6a1242 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20R=C3=BChsen?= Date: Sun, 3 Mar 2019 17:05:58 +0100 Subject: [PATCH] * fuzz/wget_netrc_fuzzer.c: Fix fuzzer --- fuzz/wget_netrc_fuzzer.c | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/fuzz/wget_netrc_fuzzer.c b/fuzz/wget_netrc_fuzzer.c index 631c3d5e..b0d1c0fb 100644 --- a/fuzz/wget_netrc_fuzzer.c +++ b/fuzz/wget_netrc_fuzzer.c @@ -58,26 +58,49 @@ FILE *fopen_wgetrc(const char *pathname, const char *mode) return NULL; } +static int do_jump; +static jmp_buf jmpbuf; #ifdef FUZZING void exit_wget(int status) { + longjmp(jmpbuf, 1); +} +#elif defined HAVE_DLFCN_H +#include // dlsym +#ifndef RTLD_NEXT +#define RTLD_NEXT RTLD_GLOBAL +#endif +void exit(int status) +{ + if (do_jump) { + longjmp(jmpbuf, 1); + } else { + void (*libc_exit)(int) = (void(*)(int)) dlsym (RTLD_NEXT, "exit"); + libc_exit(status); + } } #endif int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { +#ifdef HAVE_FMEMOPEN FILE *fp; struct fileinfo *fi; - const char *user = NULL, *pw = NULL; + const char *user = NULL, *pw = NULL; if (size > 4096) // same as max_len = ... in .options file return 0; - CLOSE_STDERR - fp = fmemopen((void *) data, size, "r"); if (!fp) return 0; + CLOSE_STDERR + + do_jump = 1; + + if (setjmp(jmpbuf)) + goto done; + opt.netrc = 1; user = NULL; // get first entry @@ -86,11 +109,16 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) user = "u"; // get entry for user 'u' search_netrc("x", &user, &pw, 1, fp); + +done: netrc_cleanup(); fclose(fp); + do_jump = 0; + RESTORE_STDERR +#endif return 0; }