1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
|
/*
* sys_poll(struct pollfd __user *ufds, unsigned int nfds, int timeout);
*/
#include <stdlib.h>
#include <signal.h>
#include <asm/poll.h>
#include "fd.h"
#include "random.h"
#include "sanitise.h"
#include "utils.h"
#include "compat.h"
static const unsigned long poll_events[] = {
POLLIN, POLLPRI, POLLOUT, POLLERR,
POLLHUP, POLLNVAL, POLLRDBAND, POLLWRNORM,
POLLWRBAND, POLLMSG, POLLREMOVE, POLLRDHUP,
POLLFREE, POLL_BUSY_LOOP,
};
static void sanitise_poll(struct syscallrecord *rec)
{
struct pollfd *pollfd;
unsigned int i;
unsigned int num_fds = rnd() % 10;
pollfd = zmalloc(num_fds * sizeof(struct pollfd));
for (i = 0; i < num_fds; i++) {
pollfd[i].fd = get_random_fd();
pollfd[i].events = set_rand_bitmask(ARRAY_SIZE(poll_events), poll_events);
}
rec->a1 = (unsigned long) pollfd;
rec->a2 = num_fds;
}
static void post_poll(struct syscallrecord *rec)
{
freeptr(&rec->a1);
}
struct syscallentry syscall_poll = {
.name = "poll",
.num_args = 3,
.arg1name = "ufds",
.arg2name = "nfds",
.arg3name = "timeout_msecs",
.arg3type = ARG_RANGE,
.low3range = 0,
.hi3range = 1,
.flags = NEED_ALARM,
.sanitise = sanitise_poll,
.post = post_poll,
};
/*
* SYSCALL_DEFINE5(ppoll, struct pollfd __user *, ufds, unsigned int, nfds,
struct timespec __user *, tsp, const sigset_t __user *, sigmask, size_t, sigsetsize)
*/
static void sanitise_ppoll(struct syscallrecord *rec)
{
struct pollfd *fds;
struct timespec *ts;
sanitise_poll(rec);
fds = (struct pollfd *) rec->a1;
if (fds == NULL)
return;
ts = zmalloc(sizeof(struct timespec));
rec->a3 = (unsigned long) ts;
ts->tv_sec = 1;
ts->tv_nsec = 0;
rec->a5 = sizeof(sigset_t);
}
static void post_ppoll(struct syscallrecord *rec)
{
freeptr(&rec->a1);
freeptr(&rec->a3);
}
struct syscallentry syscall_ppoll = {
.name = "ppoll",
.num_args = 5,
.arg1name = "ufds",
.arg2name = "nfds",
.arg3name= "tsp",
.arg4name = "sigmask",
.arg4type = ARG_ADDRESS,
.arg5name = "sigsetsize",
.flags = NEED_ALARM,
.sanitise = sanitise_ppoll,
.post = post_ppoll,
};
|