/* * Copyright (c) 2021 Todd C. Miller * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include #include #include #include #include #if defined(HAVE_STDINT_H) # include #elif defined(HAVE_INTTYPES_H) # include #endif #include "sudo_compat.h" #include "sudo_conf.h" #include "sudo_debug.h" #include "sudo_util.h" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) { char tempfile[] = "/tmp/sudo_conf.XXXXXX"; size_t nwritten; int fd; setprogname("fuzz_sudo_conf"); /* sudo_conf_read() uses a conf file path, not an open file. */ fd = mkstemp(tempfile); if (fd == -1) return 0; nwritten = write(fd, data, size); if (nwritten != size) { close(fd); return 0; } close(fd); /* sudo_conf_read() will re-init and free old data each time it runs. */ sudo_conf_clear_paths(); sudo_conf_read(tempfile, SUDO_CONF_ALL); unlink(tempfile); fflush(stdout); return 0; }