diff --git a/tests/Makefile.tests.mk b/tests/Makefile.tests.mk index 7840dcc14f..049edb7f44 100644 --- a/tests/Makefile.tests.mk +++ b/tests/Makefile.tests.mk @@ -287,6 +287,7 @@ VARIED_NAMES=\ stdlib/mktemp \ stdlib/realpath \ sys_epoll/epoll \ + sys_epoll/epoll_del \ sys_mman/mmap \ sys_resource/constants \ sys_socket/getpeername \ diff --git a/tests/expected/sys_epoll/epoll_del.stdout b/tests/expected/sys_epoll/epoll_del.stdout new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/sys_epoll/epoll_del.c b/tests/sys_epoll/epoll_del.c new file mode 100644 index 0000000000..9fe9a2f4bc --- /dev/null +++ b/tests/sys_epoll/epoll_del.c @@ -0,0 +1,53 @@ +#include +#include +#include +#include +#include + +#include "../test_helpers.h" + +struct Context { + int dummy; +}; + +int main() { + int epfd = epoll_create1(EPOLL_CLOEXEC); + ERROR_IF(epoll_create1, epfd, == -1); + int pipefd[2]; + pipe(pipefd); + + struct Context *ctx = malloc(sizeof(struct Context)); + ctx->dummy = 1; + + struct epoll_event ev; + ev.events = EPOLLIN; + ev.data.ptr = ctx; + + int status = epoll_ctl(epfd, EPOLL_CTL_ADD, pipefd[0], &ev); + ERROR_IF(epoll_ctl, status, == -1); + + struct epoll_event del_ev; + del_ev.data.ptr = NULL; + status = epoll_ctl(epfd, EPOLL_CTL_DEL, pipefd[0], &del_ev); + ERROR_IF(epoll_ctl, status, == -1); + free(ctx); + ctx = NULL; + + write(pipefd[1], "data", 4); + write(pipefd[1], "data", 4); + + struct epoll_event events[1]; + int evs = 0; + while (1) { + int nfds = epoll_wait(epfd, events, 1, 1000); + evs += nfds; + if (nfds > 0) { + printf("garbage data: %p\n", events[1].data.ptr); + } else { + break; + } + } + + UNEXP_IF(epoll_wait, evs, != 0); + return 0; +} \ No newline at end of file