From: Dmitry V. Levin Date: Mon, 16 May 2016 21:43:35 +0000 (+0000) Subject: Fix decoding of epoll_ctl operation argument X-Git-Tag: v4.12~151 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=55044d9670d46ba0f995948a226d7e45a18de5df;p=strace Fix decoding of epoll_ctl operation argument Consistently treat operation argument of epoll_ctl syscall as int to match the kernel behaviour. * epoll.c (SYS_FUNC(epoll_ctl)): Assign 2nd argument of syscall to a variable of type unsigned int and use it in all subsequent checks and lookups. * tests/epoll_ctl.c (invoke_syscall): New function. (main): Use it. --- diff --git a/epoll.c b/epoll.c index 20d306c4..7382e0c0 100644 --- a/epoll.c +++ b/epoll.c @@ -70,12 +70,13 @@ SYS_FUNC(epoll_ctl) { printfd(tcp, tcp->u_arg[0]); tprints(", "); - printxval(epollctls, tcp->u_arg[1], "EPOLL_CTL_???"); + const unsigned int op = tcp->u_arg[1]; + printxval(epollctls, op, "EPOLL_CTL_???"); tprints(", "); printfd(tcp, tcp->u_arg[2]); tprints(", "); struct epoll_event ev; - if (EPOLL_CTL_DEL == tcp->u_arg[1]) + if (EPOLL_CTL_DEL == op) printaddr(tcp->u_arg[3]); else if (!umove_or_printaddr(tcp, tcp->u_arg[3], &ev)) print_epoll_event(tcp, &ev, sizeof(ev), 0); diff --git a/tests/epoll_ctl.c b/tests/epoll_ctl.c index ffabca17..231e2710 100644 --- a/tests/epoll_ctl.c +++ b/tests/epoll_ctl.c @@ -8,22 +8,29 @@ # include # include +static long +invoke_syscall(unsigned long epfd, unsigned long op, unsigned long fd, void *ev) +{ + op |= (unsigned long) 0xffffffff00000000; + return syscall(__NR_epoll_ctl, epfd, op, fd, (unsigned long) ev); +} + int main(void) { struct epoll_event *const ev = tail_alloc(sizeof(*ev)); ev->events = EPOLLIN; - long rc = syscall(__NR_epoll_ctl, -1, EPOLL_CTL_ADD, -2, ev); + long rc = invoke_syscall(-1U, EPOLL_CTL_ADD, -2U, ev); printf("epoll_ctl(-1, EPOLL_CTL_ADD, -2, {EPOLLIN," " {u32=%u, u64=%" PRIu64 "}}) = %ld %s (%m)\n", ev->data.u32, ev->data.u64, rc, errno2name()); - rc = syscall(__NR_epoll_ctl, -3, EPOLL_CTL_DEL, -4, ev); + rc = invoke_syscall(-3U, EPOLL_CTL_DEL, -4U, ev); printf("epoll_ctl(-3, EPOLL_CTL_DEL, -4, %p) = %ld %s (%m)\n", ev, rc, errno2name()); - rc = syscall(__NR_epoll_ctl, -1L, EPOLL_CTL_MOD, -16L, 0); + rc = invoke_syscall(-1UL, EPOLL_CTL_MOD, -16UL, 0); printf("epoll_ctl(-1, EPOLL_CTL_MOD, -16, NULL) = %ld %s (%m)\n", rc, errno2name());