Fall back to a temp file if fmemopen() is not available().

This commit is contained in:
Todd C. Miller
2021-02-07 13:56:15 -07:00
parent c19cb388bc
commit a72d743ec8
8 changed files with 122 additions and 13 deletions

View File

@@ -43,7 +43,34 @@ open_sudoers(const char *file, bool doedit, bool *keepopen)
return NULL;
}
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
static FILE *
open_data(const uint8_t *data, size_t size)
{
#ifdef HAVE_FMEMOPEN
/* Operate in-memory. */
return fmemopen((void *)data, size, "r");
#else
char tempfile[] = "/tmp/sudoers.XXXXXX";
size_t nwritten;
int fd;
/* Use (unlinked) temporary file. */
fd = mkstemp(tempfile);
if (fd == -1)
return NULL;
unlink(tempfile);
nwritten = write(fd, data, size);
if (nwritten != size) {
close(fd);
return NULL;
}
lseek(fd, 0, SEEK_SET);
return fdopen(fd, "r");
#endif
}
int
LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
{
FILE *fp;
@@ -51,8 +78,7 @@ int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
if (size < 5)
return 0;
/* Operate in-memory. */
fp = fmemopen((void *)data, size, "r");
fp = open_data(data, size);
if (fp == NULL)
return 0;