X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=blobdiff_plain;f=tests%2Fregression%2Fkernel%2Fselect_poll_epoll.c;h=42d554cb28468d9023e5368f0a6cb5a1bd2e093b;hp=cb39b08191b41701a9bb299cd2c414203499dcc3;hb=refs%2Fheads%2Fsow-2019-0002-rev1;hpb=9d55857158aaa320476b962fc67a9c93be8c77c3 diff --git a/tests/regression/kernel/select_poll_epoll.c b/tests/regression/kernel/select_poll_epoll.c index cb39b0819..42d554cb2 100644 --- a/tests/regression/kernel/select_poll_epoll.c +++ b/tests/regression/kernel/select_poll_epoll.c @@ -1,3 +1,10 @@ +/* + * Copyright (C) 2016 Julien Desfossez + * + * SPDX-License-Identifier: GPL-2.0-only + * + */ + #include #include #include @@ -17,7 +24,7 @@ #include #include #include -#include +#include #define BUF_SIZE 256 #define NB_FD 1 @@ -31,7 +38,7 @@ #define MSEC_PER_NSEC (MSEC_PER_USEC * 1000) static int timeout; /* seconds, -1 to disable */ -volatile static int stop_thread; +static volatile int stop_thread; static int wait_fd; struct ppoll_thread_data { @@ -39,7 +46,7 @@ struct ppoll_thread_data { int value; }; -void test_select_big(void) +static void test_select_big(void) { fd_set rfds, wfds, exfds; struct timeval tv; @@ -88,7 +95,7 @@ end: return; } -void test_pselect(void) +static void test_pselect(void) { fd_set rfds; struct timespec tv; @@ -121,7 +128,7 @@ void test_pselect(void) } -void test_select(void) +static void test_select(void) { fd_set rfds; struct timeval tv; @@ -154,7 +161,7 @@ void test_select(void) } -void test_poll(void) +static void test_poll(void) { struct pollfd ufds[NB_FD]; char buf[BUF_SIZE]; @@ -178,7 +185,7 @@ void test_poll(void) } } -void test_ppoll(void) +static void test_ppoll(void) { struct pollfd ufds[NB_FD]; char buf[BUF_SIZE]; @@ -210,7 +217,7 @@ void test_ppoll(void) } } -void test_ppoll_big(void) +static void test_ppoll_big(void) { struct pollfd ufds[MAX_FDS]; char buf[BUF_SIZE]; @@ -249,7 +256,7 @@ void test_ppoll_big(void) return; } -void test_epoll(void) +static void test_epoll(void) { int ret, epollfd; char buf[BUF_SIZE]; @@ -291,7 +298,7 @@ end: return; } -void test_pepoll(void) +static void test_pepoll(void) { int ret, epollfd; char buf[BUF_SIZE]; @@ -333,7 +340,7 @@ end: return; } -void run_working_cases(void) +static void run_working_cases(void) { int ret; int pipe_fds[2]; @@ -379,7 +386,7 @@ end: * segfault (eventually with a "*** stack smashing detected ***" message). * The event should contain an array of 100 FDs filled with garbage. */ -void ppoll_fds_buffer_overflow(void) +static void ppoll_fds_buffer_overflow(void) { struct pollfd ufds[NB_FD]; char buf[BUF_SIZE]; @@ -410,7 +417,7 @@ void ppoll_fds_buffer_overflow(void) * cleanly fail with a "Invalid argument". * The event should contain an empty array of FDs and overflow = 1. */ -void ppoll_fds_ulong_max(void) +static void ppoll_fds_ulong_max(void) { struct pollfd ufds[NB_FD]; char buf[BUF_SIZE]; @@ -437,30 +444,36 @@ void ppoll_fds_ulong_max(void) } /* - * Select is limited to 1024 FDs, should output a pselect event - * with 0 FDs. + * Pass an invalid file descriptor to pselect6(). The syscall should return + * -EBADF. The recorded event should contain a "ret = -EBADF (-9)". */ -void pselect_fd_too_big(void) +static void pselect_invalid_fd(void) { fd_set rfds; int ret; - int fd2; + int fd; char buf[BUF_SIZE]; /* - * Test if nfds > 1024. - * Make sure ulimit is set correctly (ulimit -n 2048). + * Open a file, close it and use the closed FD in the pselect6 call. */ - fd2 = dup2(wait_fd, 2047); - if (fd2 != 2047) { - perror("dup2"); - return; + + fd = open("/dev/null", O_RDONLY); + if (fd == -1) { + perror("open"); + goto error; } - FD_ZERO(&rfds); - FD_SET(fd2, &rfds); - ret = syscall(SYS_pselect6, fd2 + 1, &rfds, NULL, NULL, NULL, NULL); + ret = close(fd); + if (ret == -1) { + perror("close"); + goto error; + } + FD_ZERO(&rfds); + FD_SET(fd, &rfds); + + ret = syscall(SYS_pselect6, fd + 1, &rfds, NULL, NULL, NULL, NULL); if (ret == -1) { perror("# pselect()"); } else if (ret) { @@ -472,14 +485,15 @@ void pselect_fd_too_big(void) } else { printf("# [pselect] timeout\n"); } - +error: + return; } /* * Invalid pointer as writefds, should output a ppoll event * with 0 FDs. */ -void pselect_invalid_pointer(void) +static void pselect_invalid_pointer(void) { fd_set rfds; int ret; @@ -510,7 +524,7 @@ void pselect_invalid_pointer(void) * Pass an invalid pointer to epoll_pwait, should fail with * "Bad address", the event returns 0 FDs. */ -void epoll_pwait_invalid_pointer(void) +static void epoll_pwait_invalid_pointer(void) { int ret, epollfd; char buf[BUF_SIZE]; @@ -554,7 +568,7 @@ end: * Set maxevents to INT_MAX, should output "Invalid argument" * The event should return an empty array. */ -void epoll_pwait_int_max(void) +static void epoll_pwait_int_max(void) { int ret, epollfd; char buf[BUF_SIZE]; @@ -593,7 +607,7 @@ end: return; } -void *ppoll_writer(void *arg) +static void *ppoll_writer(void *arg) { struct ppoll_thread_data *data = (struct ppoll_thread_data *) arg; @@ -606,7 +620,7 @@ void *ppoll_writer(void *arg) return NULL; } -void do_ppoll(int *fds, struct pollfd *ufds) +static void do_ppoll(int *fds, struct pollfd *ufds) { int i, ret; struct timespec ts; @@ -635,7 +649,7 @@ void do_ppoll(int *fds, struct pollfd *ufds) } } -void stress_ppoll(int *fds, int value) +static void stress_ppoll(int *fds, int value) { pthread_t writer; int iter, ret; @@ -676,7 +690,7 @@ end: * * ppoll should work as expected and the trace should be readable at the end. */ -void ppoll_concurrent_write(void) +static void ppoll_concurrent_write(void) { int i, ret, fds[MAX_FDS]; @@ -701,7 +715,7 @@ void ppoll_concurrent_write(void) return; } -void *epoll_pwait_writer(void *addr) +static void *epoll_pwait_writer(void *addr) { srand(time(NULL)); @@ -718,22 +732,23 @@ void *epoll_pwait_writer(void *addr) * buffer allocated for the returned data. This should randomly segfault. * The trace should be readable and no kernel OOPS should occur. */ -void epoll_pwait_concurrent_munmap(void) +static void epoll_pwait_concurrent_munmap(void) { int ret, epollfd, i, fds[MAX_FDS]; char buf[BUF_SIZE]; struct epoll_event *epoll_event; - void *addr = NULL; pthread_t writer; - + for (i = 0; i < MAX_FDS; i++) { + fds[i] = -1; + } epollfd = epoll_create(MAX_FDS); if (epollfd < 0) { perror("[eppoll] create"); goto end; } - epoll_event = mmap(addr, MAX_FDS * sizeof(struct epoll_event), + epoll_event = mmap(NULL, MAX_FDS * sizeof(struct epoll_event), PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); if (epoll_event == MAP_FAILED) { @@ -759,7 +774,7 @@ void epoll_pwait_concurrent_munmap(void) (void *) epoll_event); if (ret != 0) { fprintf(stderr, "[error] pthread_create\n"); - goto end; + goto end_unmap; } ret = epoll_pwait(epollfd, epoll_event, 1, 1, NULL); @@ -790,7 +805,7 @@ end_unmap: } } - ret = munmap(addr, MAX_FDS * sizeof(struct epoll_event)); + ret = munmap(epoll_event, MAX_FDS * sizeof(struct epoll_event)); if (ret != 0) { perror("munmap"); } @@ -799,30 +814,21 @@ end: return; } -void usage(poptContext optCon, int exitcode, char *error, char *addl) -{ - poptPrintUsage(optCon, stderr, 0); - if (error) { - fprintf(stderr, "%s: %s\n", error, addl); - } - exit(exitcode); -} - -void print_list(void) +static void print_list(void) { fprintf(stderr, "Test list (-t X):\n"); fprintf(stderr, "\t1: Working cases for select, pselect6, poll, ppoll " "and epoll, waiting for input\n"); fprintf(stderr, "\t2: Timeout cases (1ms) for select, pselect6, poll, " "ppoll and epoll\n"); - fprintf(stderr, "\t3: pselect with a FD > 1023\n"); + fprintf(stderr, "\t3: pselect with an invalid fd\n"); fprintf(stderr, "\t4: ppoll with %d FDs\n", MAX_FDS); fprintf(stderr, "\t5: ppoll buffer overflow, should segfault, waits " "for input\n"); - fprintf(stderr, "\t6: pselect with invalid pointer, waits for " + fprintf(stderr, "\t6: pselect with an invalid pointer, waits for " "input\n"); fprintf(stderr, "\t7: ppoll with ulong_max fds, waits for input\n"); - fprintf(stderr, "\t8: epoll_pwait with invalid pointer, waits for " + fprintf(stderr, "\t8: epoll_pwait with an invalid pointer, waits for " "input\n"); fprintf(stderr, "\t9: epoll_pwait with maxevents set to INT_MAX, " "waits for input\n"); @@ -895,7 +901,7 @@ int main(int argc, const char **argv) run_working_cases(); break; case 3: - pselect_fd_too_big(); + pselect_invalid_fd(); break; case 4: test_ppoll_big();