}
/*
- * 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)
+void pselect_invalid_fd(void)
{
- long rfds[2048 / (sizeof(long) * CHAR_BIT)] = { 0 };
+ 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;
+ }
+
+ ret = close(fd);
+ if (ret == -1) {
+ perror("close");
+ goto error;
}
- FD_SET(fd2, (fd_set *) &rfds);
- ret = syscall(SYS_pselect6, fd2 + 1, &rfds, NULL, NULL, NULL, NULL);
+ 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) {
} else {
printf("# [pselect] timeout\n");
}
-
+error:
+ return;
}
/*
"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");
run_working_cases();
break;
case 3:
- pselect_fd_too_big();
+ pselect_invalid_fd();
break;
case 4:
test_ppoll_big();
class Test3(TraceParser):
def __init__(self, trace, pid):
super().__init__(trace, pid)
- self.expect["select_too_big_in"] = 0
- self.expect["select_too_big_out"] = 0
+ self.expect["select_invalid_fd_in"] = 0
+ self.expect["select_invalid_fd_out"] = 0
def select_entry(self, event):
timestamp = event.timestamp
_exceptfds_length = event["_exceptfds_length"]
exceptfds = event["exceptfds"]
- # make sure an invalid value still produces a valid event
- if n == 2048 and overflow == 0 and _readfds_length == 0:
- self.expect["select_too_big_in"] = 1
+ if n > 0 and overflow == 0:
+ self.expect["select_invalid_fd_in"] = 1
def select_exit(self, event):
timestamp = event.timestamp
_exceptfds_length = event["_exceptfds_length"]
exceptfds = event["exceptfds"]
- # make sure an invalid value still produces a valid event
+ # make sure the event has a ret field equal to -EBADF
if ret == -9 and overflow == 0 and _readfds_length == 0:
- self.expect["select_too_big_out"] = 1
+ self.expect["select_invalid_fd_out"] = 1
class Test4(TraceParser):