Fall back to a temp file if fmemopen() is not available().
This commit is contained in:
@@ -282,6 +282,9 @@
|
||||
/* Define to 1 if you have the `fexecve' function. */
|
||||
#undef HAVE_FEXECVE
|
||||
|
||||
/* Define to 1 if you have the `fmemopen' function. */
|
||||
#undef HAVE_FMEMOPEN
|
||||
|
||||
/* Define to 1 if you have the `fnmatch' function. */
|
||||
#undef HAVE_FNMATCH
|
||||
|
||||
|
2
configure
vendored
2
configure
vendored
@@ -3220,6 +3220,7 @@ as_fn_append ac_header_c_list " sys/sysmacros.h sys_sysmacros_h HAVE_SYS_SYSMACR
|
||||
as_fn_append ac_header_c_list " sys/syscall.h sys_syscall_h HAVE_SYS_SYSCALL_H"
|
||||
as_fn_append ac_header_c_list " sys/statvfs.h sys_statvfs_h HAVE_SYS_STATVFS_H"
|
||||
as_fn_append ac_func_c_list " fexecve HAVE_FEXECVE"
|
||||
as_fn_append ac_func_c_list " fmemopen HAVE_FMEMOPEN"
|
||||
as_fn_append ac_func_c_list " killpg HAVE_KILLPG"
|
||||
as_fn_append ac_func_c_list " nl_langinfo HAVE_NL_LANGINFO"
|
||||
as_fn_append ac_func_c_list " faccessat HAVE_FACCESSAT"
|
||||
@@ -20167,6 +20168,7 @@ done
|
||||
|
||||
|
||||
|
||||
|
||||
case "$host_os" in
|
||||
hpux*)
|
||||
if test X"$ac_cv_func_pread" = X"yes"; then
|
||||
|
@@ -2685,7 +2685,7 @@ dnl
|
||||
dnl Function checks
|
||||
dnl
|
||||
AC_FUNC_GETGROUPS
|
||||
AC_CHECK_FUNCS_ONCE([fexecve killpg nl_langinfo faccessat wordexp getauxval fseeko])
|
||||
AC_CHECK_FUNCS_ONCE([fexecve fmemopen killpg nl_langinfo faccessat wordexp getauxval fseeko])
|
||||
case "$host_os" in
|
||||
hpux*)
|
||||
if test X"$ac_cv_func_pread" = X"yes"; then
|
||||
|
@@ -34,13 +34,39 @@
|
||||
|
||||
#include "iolog_json.h"
|
||||
|
||||
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/json.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)
|
||||
{
|
||||
struct eventlog *evlog = NULL;
|
||||
FILE *fp;
|
||||
|
||||
/* Operate in-memory. */
|
||||
fp = fmemopen((void *)data, size, "r");
|
||||
fp = open_data(data, size);
|
||||
if (fp == NULL)
|
||||
return 0;
|
||||
|
||||
|
@@ -32,13 +32,39 @@
|
||||
#include "sudo_iolog.h"
|
||||
#include "sudo_util.h"
|
||||
|
||||
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/legacy.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)
|
||||
{
|
||||
struct eventlog *evlog = NULL;
|
||||
FILE *fp;
|
||||
|
||||
/* Operate in-memory. */
|
||||
fp = fmemopen((void *)data, size, "r");
|
||||
fp = open_data(data, size);
|
||||
if (fp == NULL)
|
||||
return 0;
|
||||
|
||||
|
@@ -40,7 +40,8 @@
|
||||
#include "sudo_iolog.h"
|
||||
#include "sudo_util.h"
|
||||
|
||||
int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
|
||||
int
|
||||
LLVMFuzzerTestOneInput(const uint8_t *data, size_t size)
|
||||
{
|
||||
struct iolog_file iolog_file = { true };
|
||||
struct timing_closure closure;
|
||||
|
@@ -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;
|
||||
|
||||
|
@@ -38,6 +38,32 @@ open_sudoers(const char *file, bool doedit, bool *keepopen)
|
||||
return fopen(file, "r");
|
||||
}
|
||||
|
||||
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/ldif.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)
|
||||
{
|
||||
struct sudoers_parse_tree parse_tree;
|
||||
@@ -47,8 +73,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;
|
||||
|
||||
|
Reference in New Issue
Block a user