fuzz: handle errors from wrapfd_new_dummy()

This commit is contained in:
Matt Johnston 2021-03-06 22:58:57 +08:00
parent d0d1ede191
commit d2bfa6aedc
2 changed files with 23 additions and 6 deletions

View File

@ -230,10 +230,19 @@ int fuzz_spawn_command(int *ret_writefd, int *ret_readfd, int *ret_errfd, pid_t
if (ret_errfd) { if (ret_errfd) {
*ret_errfd = wrapfd_new_dummy(); *ret_errfd = wrapfd_new_dummy();
} }
*ret_pid = 999; if (*ret_writefd == -1 || *ret_readfd == -1 || (ret_errfd && *ret_errfd == -1)) {
return DROPBEAR_SUCCESS; m_close(*ret_writefd);
} m_close(*ret_readfd);
if (ret_errfd) {
m_close(*ret_errfd);
}
return DROPBEAR_FAILURE;
} else {
*ret_pid = 999;
return DROPBEAR_SUCCESS;
}
}
/* Fake dropbear_listen, always returns failure for now. /* Fake dropbear_listen, always returns failure for now.
TODO make it sometimes return success with wrapfd_new_dummy() sockets. TODO make it sometimes return success with wrapfd_new_dummy() sockets.

View File

@ -6,7 +6,8 @@
#include "fuzz.h" #include "fuzz.h"
#define IOWRAP_MAXFD (FD_SETSIZE-1) // +100 might catch some limits...
#define IOWRAP_MAXFD (FD_SETSIZE-1 + 100)
static const int MAX_RANDOM_IN = 50000; static const int MAX_RANDOM_IN = 50000;
static const double CHANCE_CLOSE = 1.0 / 600; static const double CHANCE_CLOSE = 1.0 / 600;
static const double CHANCE_INTR = 1.0 / 900; static const double CHANCE_INTR = 1.0 / 900;
@ -75,7 +76,14 @@ int wrapfd_new_dummy() {
} }
int fd = dup(devnull_fd); int fd = dup(devnull_fd);
assert(fd != -1); if (fd == -1) {
return -1;
}
if (fd > IOWRAP_MAXFD) {
close(fd);
errno = EMFILE;
return -1;
}
assert(wrap_fds[fd].mode == UNUSED); assert(wrap_fds[fd].mode == UNUSED);
wrap_fds[fd].mode = DUMMY; wrap_fds[fd].mode = DUMMY;
wrap_fds[fd].closein = 0; wrap_fds[fd].closein = 0;
@ -92,7 +100,7 @@ static void wrapfd_remove(int fd) {
assert(fd <= IOWRAP_MAXFD); assert(fd <= IOWRAP_MAXFD);
assert(wrap_fds[fd].mode != UNUSED); assert(wrap_fds[fd].mode != UNUSED);
wrap_fds[fd].mode = UNUSED; wrap_fds[fd].mode = UNUSED;
m_close(fd); close(fd);
} }
int wrapfd_close(int fd) { int wrapfd_close(int fd) {