blob: 86e80c52c060385ba664e6085b4913984a05129d [file] [log] [blame]
Dmitry V. Levine837b142015-02-04 02:09:52 +00001/*
2 * Based on test by Dr. David Alan Gilbert <dave@treblig.org>
3 */
Dmitry V. Levin4960b2f2015-08-27 08:24:39 +00004#include <stdio.h>
5#include <string.h>
Dmitry V. Levine837b142015-02-04 02:09:52 +00006#include <unistd.h>
7#include <sys/select.h>
8
9static fd_set set[0x1000000 / sizeof(fd_set)];
10
Dmitry V. Levin4960b2f2015-08-27 08:24:39 +000011int main(int ac, char **av)
Dmitry V. Levine837b142015-02-04 02:09:52 +000012{
13 int fds[2];
Dmitry V. Levin100bf7c2015-09-18 21:37:09 +000014 struct {
15 struct timeval tv;
16 int pad[2];
17 } tm = {
18 .tv = { .tv_usec = 123 },
19 .pad = { 0xdeadbeef, 0xbadc0ded }
20 };
Dmitry V. Levin4960b2f2015-08-27 08:24:39 +000021 int is_select = ac < 2 || strcmp(av[1], "pselect6");
Dmitry V. Levine837b142015-02-04 02:09:52 +000022
Dmitry V. Levin100bf7c2015-09-18 21:37:09 +000023 if (pipe(fds))
24 return 77;
Dmitry V. Levine837b142015-02-04 02:09:52 +000025
26 /*
27 * Start with a nice simple select.
28 */
29 FD_ZERO(set);
Dmitry V. Levin4960b2f2015-08-27 08:24:39 +000030 FD_SET(fds[0], set);
31 FD_SET(fds[1], set);
Dmitry V. Levin100bf7c2015-09-18 21:37:09 +000032 if (select(fds[1] + 1, set, set, set, NULL) != 1)
33 return 77;
Dmitry V. Levin4960b2f2015-08-27 08:24:39 +000034 if (is_select)
35 printf("select(%d, [%d %d], [%d %d], [%d %d], NULL) = 1 ()\n",
36 fds[1] + 1, fds[0], fds[1],
37 fds[0], fds[1], fds[0], fds[1]);
38 else
39 printf("pselect6(%d, [%d %d], [%d %d], [%d %d], NULL, NULL) "
40 "= 1 ()\n",
41 fds[1] + 1, fds[0], fds[1],
42 fds[0], fds[1], fds[0], fds[1]);
Dmitry V. Levine837b142015-02-04 02:09:52 +000043
44 /*
45 * Now the crash case that trinity found, negative nfds
46 * but with a pointer to a large chunk of valid memory.
47 */
48 FD_ZERO(set);
Dmitry V. Levin4960b2f2015-08-27 08:24:39 +000049 FD_SET(fds[1],set);
Dmitry V. Levin100bf7c2015-09-18 21:37:09 +000050 if (select(-1, NULL, set, NULL, NULL) != -1)
51 return 77;
Dmitry V. Levin4960b2f2015-08-27 08:24:39 +000052 if (is_select)
53 printf("select(-1, NULL, %p, NULL, NULL) "
54 "= -1 EINVAL (Invalid argument)\n", set);
55 else
56 printf("pselect6(-1, NULL, %p, NULL, NULL, NULL) "
57 "= -1 EINVAL (Invalid argument)\n", set);
Dmitry V. Levine837b142015-02-04 02:09:52 +000058
59 /*
60 * Another variant, with nfds exceeding FD_SETSIZE limit.
61 */
62 FD_ZERO(set);
Dmitry V. Levin4960b2f2015-08-27 08:24:39 +000063 FD_SET(fds[0],set);
Dmitry V. Levin100bf7c2015-09-18 21:37:09 +000064 if (select(FD_SETSIZE + 1, set, set + 1, NULL, &tm.tv))
65 return 77;
Dmitry V. Levin4960b2f2015-08-27 08:24:39 +000066 if (is_select)
Dmitry V. Levin100bf7c2015-09-18 21:37:09 +000067 printf("select(%d, [%d], [], NULL, {0, 123}) = 0 (Timeout)\n",
Dmitry V. Levin4960b2f2015-08-27 08:24:39 +000068 FD_SETSIZE + 1, fds[0]);
69 else
Dmitry V. Levin100bf7c2015-09-18 21:37:09 +000070 printf("pselect6(%d, [%d], [], NULL, {0, 123000}, NULL) "
Dmitry V. Levin4960b2f2015-08-27 08:24:39 +000071 "= 0 (Timeout)\n", FD_SETSIZE + 1, fds[0]);
Dmitry V. Levine837b142015-02-04 02:09:52 +000072
Dmitry V. Levin4960b2f2015-08-27 08:24:39 +000073 puts("+++ exited with 0 +++");
Dmitry V. Levine837b142015-02-04 02:09:52 +000074 return 0;
75}