t_poll.c revision 1.12 1 /* $NetBSD: t_poll.c,v 1.12 2025/02/10 02:41:34 riastradh Exp $ */
2
3 /*-
4 * Copyright (c) 2011 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Matthias Scheler.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 */
31
32 #include <sys/ioctl.h>
33 #include <sys/socket.h>
34 #include <sys/stat.h>
35 #include <sys/time.h>
36 #include <sys/wait.h>
37
38 #include <atf-c.h>
39 #include <errno.h>
40 #include <fcntl.h>
41 #include <paths.h>
42 #include <poll.h>
43 #include <pthread.h>
44 #include <stdio.h>
45 #include <stdlib.h>
46 #include <signal.h>
47 #include <termios.h>
48 #include <unistd.h>
49
50 #include "h_macros.h"
51
52 static int desc;
53
54 static void
55 child1(void)
56 {
57 struct pollfd pfd;
58
59 pfd.fd = desc;
60 pfd.events = POLLIN | POLLHUP | POLLOUT;
61
62 (void)poll(&pfd, 1, 2000);
63 (void)printf("child1 exit\n");
64 }
65
66 static void
67 child2(void)
68 {
69 struct pollfd pfd;
70
71 pfd.fd = desc;
72 pfd.events = POLLIN | POLLHUP | POLLOUT;
73
74 (void)sleep(1);
75 (void)poll(&pfd, 1, INFTIM);
76 (void)printf("child2 exit\n");
77 }
78
79 static void
80 child3(void)
81 {
82 struct pollfd pfd;
83
84 (void)sleep(5);
85
86 pfd.fd = desc;
87 pfd.events = POLLIN | POLLHUP | POLLOUT;
88
89 (void)poll(&pfd, 1, INFTIM);
90 (void)printf("child3 exit\n");
91 }
92
93 ATF_TC(3way);
94 ATF_TC_HEAD(3way, tc)
95 {
96 atf_tc_set_md_var(tc, "timeout", "15");
97 atf_tc_set_md_var(tc, "descr",
98 "Check for 3-way collision for descriptor. First child comes "
99 "and polls on descriptor, second child comes and polls, first "
100 "child times out and exits, third child comes and polls. When "
101 "the wakeup event happens, the two remaining children should "
102 "both be awaken. (kern/17517)");
103 }
104
105 ATF_TC_BODY(3way, tc)
106 {
107 int pf[2];
108 int status, i;
109 pid_t pid;
110 ssize_t nwrit;
111
112 RL(pipe(pf));
113 desc = pf[0];
114
115 RL(pid = fork());
116 if (pid == 0) {
117 if (close(pf[1]) == -1)
118 _exit(1);
119 child1();
120 _exit(0);
121 /* NOTREACHED */
122 }
123
124 RL(pid = fork());
125 if (pid == 0) {
126 if (close(pf[1]) == -1)
127 _exit(1);
128 child2();
129 _exit(0);
130 /* NOTREACHED */
131 }
132
133 RL(pid = fork());
134 if (pid == 0) {
135 if (close(pf[1]) == -1)
136 _exit(1);
137 child3();
138 _exit(0);
139 /* NOTREACHED */
140 }
141
142 (void)sleep(10);
143
144 (void)printf("parent write\n");
145
146 RL(nwrit = write(pf[1], "konec\n", 6));
147 ATF_REQUIRE_EQ_MSG(nwrit, 6, "nwrit=%zd", nwrit);
148
149 for (i = 0; i < 3; i++)
150 RL(wait(&status));
151
152 (void)printf("parent terminated\n");
153 }
154
155 ATF_TC(basic);
156 ATF_TC_HEAD(basic, tc)
157 {
158 atf_tc_set_md_var(tc, "timeout", "10");
159 atf_tc_set_md_var(tc, "descr",
160 "Basis functionality test for poll(2)");
161 }
162
163 ATF_TC_BODY(basic, tc)
164 {
165 int fds[2];
166 struct pollfd pfds[2];
167 int ret;
168 ssize_t nwrit;
169
170 RL(pipe(fds));
171
172 pfds[0].fd = fds[0];
173 pfds[0].events = POLLIN;
174 pfds[1].fd = fds[1];
175 pfds[1].events = POLLOUT;
176
177 /*
178 * Check that we get a timeout waiting for data on the read end
179 * of our pipe.
180 */
181 pfds[0].revents = -1;
182 pfds[1].revents = -1;
183 RL(ret = poll(&pfds[0], 1, 1));
184 ATF_REQUIRE_EQ_MSG(ret, 0, "got: %d", ret);
185 ATF_REQUIRE_EQ_MSG(pfds[0].revents, 0, "got: %d", pfds[0].revents);
186 ATF_REQUIRE_EQ_MSG(pfds[1].revents, -1, "got: %d", pfds[1].revents);
187
188 /* Check that the write end of the pipe as reported as ready. */
189 pfds[0].revents = -1;
190 pfds[1].revents = -1;
191 RL(ret = poll(&pfds[1], 1, 1));
192 ATF_REQUIRE_EQ_MSG(ret, 1, "got: %d", ret);
193 ATF_REQUIRE_EQ_MSG(pfds[0].revents, -1, "got: %d", pfds[0].revents);
194 ATF_REQUIRE_EQ_MSG(pfds[1].revents, POLLOUT, "got: %d",\
195 pfds[1].revents);
196
197 /* Check that only the write end of the pipe as reported as ready. */
198 pfds[0].revents = -1;
199 pfds[1].revents = -1;
200 RL(ret = poll(pfds, 2, 1));
201 ATF_REQUIRE_EQ_MSG(ret, 1, "got: %d", ret);
202 ATF_REQUIRE_EQ_MSG(pfds[0].revents, 0, "got: %d", pfds[0].revents);
203 ATF_REQUIRE_EQ_MSG(pfds[1].revents, POLLOUT, "got: %d",
204 pfds[1].revents);
205
206 /* Write data to our pipe. */
207 RL(nwrit = write(fds[1], "", 1));
208 ATF_REQUIRE_EQ_MSG(nwrit, 1, "nwrit=%zd", nwrit);
209
210 /* Check that both ends of our pipe are reported as ready. */
211 pfds[0].revents = -1;
212 pfds[1].revents = -1;
213 RL(ret = poll(pfds, 2, 1));
214 ATF_REQUIRE_EQ_MSG(ret, 2, "got: %d", ret);
215 ATF_REQUIRE_EQ_MSG(pfds[0].revents, POLLIN, "got: %d",
216 pfds[0].revents);
217 ATF_REQUIRE_EQ_MSG(pfds[1].revents, POLLOUT, "got: %d",
218 pfds[1].revents);
219
220 RL(close(fds[0]));
221 RL(close(fds[1]));
222 }
223
224 ATF_TC(err);
225 ATF_TC_HEAD(err, tc)
226 {
227 atf_tc_set_md_var(tc, "descr", "Check errors from poll(2)");
228 }
229
230 ATF_TC_BODY(err, tc)
231 {
232 struct pollfd pfd;
233 int fd = 0;
234
235 pfd.fd = fd;
236 pfd.events = POLLIN;
237
238 errno = 0;
239 ATF_REQUIRE_ERRNO(EFAULT, poll((struct pollfd *)-1, 1, -1) == -1);
240
241 errno = 0;
242 ATF_REQUIRE_ERRNO(EINVAL, poll(&pfd, 1, -2) == -1);
243 }
244
245 static const char fifo_path[] = "pollhup_fifo";
246
247 static void
248 fifo_support(void)
249 {
250
251 errno = 0;
252 if (mkfifo(fifo_path, 0600) == 0) {
253 RL(unlink(fifo_path));
254 return;
255 }
256
257 if (errno == EOPNOTSUPP) {
258 atf_tc_skip("the kernel does not support FIFOs");
259 } else {
260 atf_tc_fail("mkfifo(2) failed");
261 }
262 }
263
264 ATF_TC_WITH_CLEANUP(fifo_inout);
265 ATF_TC_HEAD(fifo_inout, tc)
266 {
267 atf_tc_set_md_var(tc, "descr",
268 "Check POLLIN/POLLOUT behavior with fifos");
269 }
270
271 ATF_TC_BODY(fifo_inout, tc)
272 {
273 struct pollfd pfd[2];
274 char *buf;
275 int rfd, wfd;
276 long pipe_buf;
277 int ret;
278 ssize_t nwrit, nread;
279
280 fifo_support();
281
282 RL(mkfifo(fifo_path, 0600));
283 RL(rfd = open(fifo_path, O_RDONLY | O_NONBLOCK));
284 RL(wfd = open(fifo_path, O_WRONLY | O_NONBLOCK));
285
286 /* Get the maximum atomic pipe write size. */
287 pipe_buf = fpathconf(wfd, _PC_PIPE_BUF);
288 ATF_REQUIRE_MSG(pipe_buf > 1, "pipe_buf=%ld", pipe_buf);
289
290 REQUIRE_LIBC(buf = malloc(pipe_buf), NULL);
291
292 memset(&pfd, 0, sizeof(pfd));
293 pfd[0].fd = rfd;
294 pfd[0].events = POLLIN | POLLRDNORM;
295 pfd[1].fd = wfd;
296 pfd[1].events = POLLOUT | POLLWRNORM;
297
298 /* We expect the FIFO to be writable but not readable. */
299 RL(ret = poll(pfd, 2, 0));
300 ATF_REQUIRE_EQ_MSG(ret, 1, "got: %d", ret);
301 ATF_REQUIRE_EQ_MSG(pfd[0].revents, 0,
302 "pfd[0].revents=0x%x", pfd[0].revents);
303 ATF_REQUIRE_EQ_MSG(pfd[1].revents, POLLOUT|POLLWRNORM,
304 "pfd[1].revents=0x%x", pfd[1].revents);
305
306 /* Write a single byte of data into the FIFO. */
307 RL(nwrit = write(wfd, buf, 1));
308 ATF_REQUIRE_EQ_MSG(nwrit, 1, "nwrit=%zd", nwrit);
309
310 /* We expect the FIFO to be readable and writable. */
311 RL(ret = poll(pfd, 2, 0));
312 ATF_REQUIRE_EQ_MSG(ret, 2, "got: %d", ret);
313 ATF_REQUIRE_EQ_MSG(pfd[0].revents, POLLIN|POLLRDNORM,
314 "pfd[0].revents=0x%x", pfd[0].revents);
315 ATF_REQUIRE_EQ_MSG(pfd[1].revents, POLLOUT|POLLWRNORM,
316 "pfd[1].revents=0x%x", pfd[1].revents);
317
318 /* Read that single byte back out. */
319 RL(nread = read(rfd, buf, 1));
320 ATF_REQUIRE_EQ_MSG(nread, 1, "nread=%zd", nread);
321
322 /*
323 * Write data into the FIFO until it is full, which is
324 * defined as insufficient buffer space to hold a the
325 * maximum atomic pipe write size.
326 */
327 while (write(wfd, buf, pipe_buf) != -1) {
328 continue;
329 }
330 ATF_REQUIRE_EQ_MSG(errno, EAGAIN, "errno=%d", errno);
331
332 /* We expect the FIFO to be readble but not writable. */
333 RL(ret = poll(pfd, 2, 0));
334 ATF_REQUIRE_EQ_MSG(ret, 1, "got: %d", ret);
335 ATF_REQUIRE_EQ_MSG(pfd[0].revents, POLLIN|POLLRDNORM,
336 "pfd[0].revents=0x%x", pfd[0].revents);
337 ATF_REQUIRE_EQ_MSG(pfd[1].revents, 0,
338 "pfd[1].revents=0x%x", pfd[1].revents);
339
340 /* Read a single byte of data from the FIFO. */
341 RL(nread = read(rfd, buf, 1));
342 ATF_REQUIRE_EQ_MSG(nread, 1, "nread=%zd", nread);
343
344 /*
345 * Because we have read only a single byte out, there will
346 * be insufficient space for a pipe_buf-sized message, so
347 * the FIFO should still not be writable.
348 */
349 RL(ret = poll(pfd, 2, 0));
350 ATF_REQUIRE_EQ_MSG(ret, 1, "got: %d", ret);
351 ATF_REQUIRE_EQ_MSG(pfd[0].revents, POLLIN|POLLRDNORM,
352 "pfd[0].revents=0x%x", pfd[0].revents);
353 ATF_REQUIRE_EQ_MSG(pfd[1].revents, 0,
354 "pfd[1].revents=0x%x", pfd[1].revents);
355
356 /*
357 * Now read enough so that exactly pipe_buf space should
358 * be available. The FIFO should be writable after that.
359 * N.B. we don't care if it's readable at this point.
360 */
361 RL(nread = read(rfd, buf, pipe_buf - 1));
362 ATF_REQUIRE_EQ_MSG(nread, pipe_buf - 1, "nread=%zd pipe_buf-1=%ld",
363 nread, pipe_buf - 1);
364 RL(ret = poll(pfd, 2, 0));
365 ATF_REQUIRE_MSG(ret >= 1, "got: %d", ret);
366 ATF_REQUIRE_EQ_MSG(pfd[1].revents, POLLOUT|POLLWRNORM,
367 "pfd[1].revents=0x%x", pfd[1].revents);
368
369 /*
370 * Now read all of the data out of the FIFO and ensure that
371 * we get back to the initial state.
372 */
373 while (read(rfd, buf, pipe_buf) != -1) {
374 continue;
375 }
376 ATF_REQUIRE_EQ_MSG(errno, EAGAIN, "errno=%d", errno);
377
378 RL(ret = poll(pfd, 2, 0));
379 ATF_REQUIRE_EQ_MSG(ret, 1, "got: %d", ret);
380 ATF_REQUIRE_EQ_MSG(pfd[0].revents, 0,
381 "pfd[0].revents=0x%x", pfd[0].revents);
382 ATF_REQUIRE_EQ_MSG(pfd[1].revents, POLLOUT|POLLWRNORM,
383 "pfd[1].revents=0x%x", pfd[1].revents);
384
385 RL(close(wfd));
386 RL(close(rfd));
387 }
388
389 ATF_TC_CLEANUP(fifo_inout, tc)
390 {
391 (void)unlink(fifo_path);
392 }
393
394 ATF_TC_WITH_CLEANUP(fifo_hup1);
395 ATF_TC_HEAD(fifo_hup1, tc)
396 {
397 atf_tc_set_md_var(tc, "descr",
398 "Check POLLHUP behavior with fifos [1]");
399 }
400
401 ATF_TC_BODY(fifo_hup1, tc)
402 {
403 struct pollfd pfd;
404 int rfd, wfd;
405 int ret;
406
407 fifo_support();
408
409 RL(mkfifo(fifo_path, 0600));
410 RL(rfd = open(fifo_path, O_RDONLY | O_NONBLOCK));
411 RL(wfd = open(fifo_path, O_WRONLY));
412
413 memset(&pfd, 0, sizeof(pfd));
414 pfd.fd = rfd;
415 pfd.events = POLLIN;
416
417 RL(close(wfd));
418
419 RL(ret = poll(&pfd, 1, 0));
420 ATF_REQUIRE_EQ_MSG(ret, 1, "got: %d", ret);
421 ATF_REQUIRE_EQ_MSG((pfd.revents & (POLLHUP|POLLOUT)), POLLHUP,
422 "revents=0x%x expected POLLHUP=0x%x but not POLLOUT=0x%x",
423 pfd.revents, POLLHUP, POLLOUT);
424
425 /*
426 * Check that POLLHUP is cleared when a writer re-connects.
427 * Since the writer will not put any data into the FIFO, we
428 * expect no events.
429 */
430 memset(&pfd, 0, sizeof(pfd));
431 pfd.fd = rfd;
432 pfd.events = POLLIN;
433
434 RL(wfd = open(fifo_path, O_WRONLY));
435 RL(ret = poll(&pfd, 1, 0));
436 ATF_REQUIRE_EQ_MSG(ret, 0, "got: %d", ret);
437 }
438
439 ATF_TC_CLEANUP(fifo_hup1, tc)
440 {
441 (void)unlink(fifo_path);
442 }
443
444 ATF_TC_WITH_CLEANUP(fifo_hup2);
445 ATF_TC_HEAD(fifo_hup2, tc)
446 {
447 atf_tc_set_md_var(tc, "descr",
448 "Check POLLHUP behavior with fifos [2]");
449 }
450
451 ATF_TC_BODY(fifo_hup2, tc)
452 {
453 struct pollfd pfd;
454 int rfd, wfd;
455 pid_t pid;
456 struct timespec ts1, ts2;
457 int ret;
458
459 fifo_support();
460
461 RL(mkfifo(fifo_path, 0600));
462 RL(rfd = open(fifo_path, O_RDONLY | O_NONBLOCK));
463 RL(wfd = open(fifo_path, O_WRONLY));
464
465 memset(&pfd, 0, sizeof(pfd));
466 pfd.fd = rfd;
467 pfd.events = POLLIN;
468
469 RL(pid = fork());
470 if (pid == 0) {
471 if (close(rfd))
472 _exit(1);
473 sleep(5);
474 if (close(wfd))
475 _exit(1);
476 _exit(0);
477 }
478 RL(close(wfd));
479
480 RL(clock_gettime(CLOCK_MONOTONIC, &ts1));
481 RL(ret = poll(&pfd, 1, INFTIM));
482 ATF_REQUIRE_EQ_MSG(ret, 1, "got: %d", ret);
483 RL(clock_gettime(CLOCK_MONOTONIC, &ts2));
484
485 /* Make sure at least a couple of seconds have elapsed. */
486 ATF_REQUIRE_MSG(ts2.tv_sec - ts1.tv_sec >= 2,
487 "ts1=%lld.%09ld ts2=%lld.%09ld",
488 (long long)ts1.tv_sec, ts1.tv_nsec,
489 (long long)ts2.tv_sec, ts2.tv_nsec);
490
491 ATF_REQUIRE_EQ_MSG((pfd.revents & (POLLHUP|POLLOUT)), POLLHUP,
492 "revents=0x%x expected POLLHUP=0x%x but not POLLOUT=0x%x",
493 pfd.revents, POLLHUP, POLLOUT);
494 }
495
496 ATF_TC_CLEANUP(fifo_hup2, tc)
497 {
498 (void)unlink(fifo_path);
499 }
500
501 static void
502 fillpipebuf(int writefd)
503 {
504 char buf[BUFSIZ] = {0};
505 size_t n = 0;
506 ssize_t nwrit;
507 int flags;
508
509 RL(flags = fcntl(writefd, F_GETFL));
510 RL(fcntl(writefd, F_SETFL, flags|O_NONBLOCK));
511 while ((nwrit = write(writefd, buf, sizeof(buf))) != -1)
512 n += (size_t)nwrit;
513 ATF_CHECK_EQ_MSG(errno, EAGAIN, "errno=%d", errno);
514 RL(fcntl(writefd, F_SETFL, flags));
515 fprintf(stderr, "filled %d with %zu bytes\n", writefd, n);
516 }
517
518 static void
519 check_write_fail(int writefd, int error)
520 {
521 int flags;
522 void (*sighandler)(int);
523 char c = 0;
524 ssize_t nwrit;
525
526 RL(flags = fcntl(writefd, F_GETFL));
527 RL(fcntl(writefd, F_SETFL, flags|O_NONBLOCK));
528
529 REQUIRE_LIBC(sighandler = signal(SIGPIPE, SIG_IGN), SIG_ERR);
530 ATF_CHECK_ERRNO(error, (nwrit = write(writefd, &c, 1)) == -1);
531 ATF_CHECK_EQ_MSG(nwrit, -1, "nwrit=%zd", nwrit);
532 REQUIRE_LIBC(signal(SIGPIPE, sighandler), SIG_ERR);
533
534 RL(fcntl(writefd, F_SETFL, flags));
535 }
536
537 static void
538 check_read_eof(int readfd)
539 {
540 int flags;
541 char c;
542 ssize_t nread;
543
544 RL(flags = fcntl(readfd, F_GETFL));
545 RL(fcntl(readfd, F_SETFL, flags|O_NONBLOCK));
546
547 RL(nread = read(readfd, &c, 1));
548 ATF_CHECK_EQ_MSG(nread, 0, "nread=%zu", nread);
549
550 RL(fcntl(readfd, F_SETFL, flags));
551 }
552
553 static void
554 check_pollclosed_delayed_write(int writefd, int readfd,
555 int expected, int writeerror)
556 {
557 struct pollfd pfd = { .fd = writefd, .events = POLLOUT };
558 struct timespec start, end, delta;
559 int nfds;
560
561 /*
562 * Don't let poll sleep for more than 3sec. (The close delay
563 * will be 2sec, and we make sure that we sleep at least 1sec.)
564 */
565 REQUIRE_LIBC(alarm(3), (unsigned)-1);
566
567 /*
568 * Wait in poll(2) indefinitely (subject to the alarm) and
569 * measure how long we slept.
570 */
571 fprintf(stderr, "poll %d\n", writefd);
572 RL(clock_gettime(CLOCK_MONOTONIC, &start));
573 RL(nfds = poll(&pfd, 1, INFTIM));
574 RL(clock_gettime(CLOCK_MONOTONIC, &end));
575 fprintf(stderr, "poll %d done nfds=%d\n", writefd, nfds);
576
577 REQUIRE_LIBC(alarm(0), (unsigned)-1);
578
579 /*
580 * The reader has been closed, so write will fail immediately
581 * with EPIPE/SIGPIPE, and thus POLLOUT must be set. POLLHUP
582 * is only returned for reads, not for writes (and is mutually
583 * exclusive with POLLOUT). Except we _do_ return POLLHUP
584 * instead of POLLOUT for terminals.
585 */
586 RL(nfds = poll(&pfd, 1, 0));
587 ATF_CHECK_EQ_MSG(nfds, 1, "nfds=%d", nfds);
588 ATF_CHECK_EQ_MSG(pfd.fd, writefd, "pfd.fd=%d writefd=%d",
589 pfd.fd, writefd);
590 ATF_CHECK_EQ_MSG((pfd.revents & (POLLHUP|POLLIN|POLLOUT)), expected,
591 "revents=0x%x expected=0x%x"
592 " POLLHUP=0x%x POLLIN=0x%x POLLOUT=0x%x",
593 pfd.revents, expected, POLLOUT, POLLHUP, POLLIN);
594
595 /*
596 * We should have slept at least 1sec.
597 */
598 timespecsub(&end, &start, &delta);
599 ATF_CHECK_MSG(delta.tv_sec >= 1,
600 "slept only %lld.%09ld", (long long)delta.tv_sec, delta.tv_nsec);
601
602 /*
603 * Write should fail with EPIPE/SIGPIPE now, or EIO for
604 * terminals -- and continue to do so.
605 */
606 check_write_fail(writefd, writeerror);
607 check_write_fail(writefd, writeerror);
608 }
609
610 static void
611 check_pollclosed_delayed_write_fifopipesocket(int writefd, int readfd)
612 {
613
614 check_pollclosed_delayed_write(writefd, readfd, POLLOUT, EPIPE);
615 }
616
617 static void
618 check_pollclosed_delayed_write_terminal(int writefd, int readfd)
619 {
620
621 check_pollclosed_delayed_write(writefd, readfd, POLLHUP, EIO);
622 }
623
624 static void
625 check_pollclosed_delayed_read(int readfd, int writefd, int pollhup)
626 {
627 struct pollfd pfd;
628 struct timespec start, end, delta;
629 int nfds;
630
631 /*
632 * Don't let poll sleep for more than 3sec. (The close delay
633 * will be 2sec, and we make sure that we sleep at least 1sec.)
634 */
635 REQUIRE_LIBC(alarm(3), (unsigned)-1);
636
637 /*
638 * Wait in poll(2) indefinitely (subject to the alarm) and
639 * measure how long we slept.
640 */
641 pfd = (struct pollfd) { .fd = readfd, .events = POLLIN };
642 fprintf(stderr, "poll %d\n", readfd);
643 RL(clock_gettime(CLOCK_MONOTONIC, &start));
644 RL(nfds = poll(&pfd, 1, INFTIM));
645 RL(clock_gettime(CLOCK_MONOTONIC, &end));
646 fprintf(stderr, "poll %d done nfds=%d\n", readfd, nfds);
647
648 REQUIRE_LIBC(alarm(0), (unsigned)-1);
649
650 /*
651 * Read will yield EOF without blocking, so POLLIN should be
652 * set, and the write side has been closed, so POLLHUP should
653 * also be set, unsolicited, if this is a pipe or FIFO -- but
654 * not if it's a socket, where POLLHUP is never set. Since we
655 * didn't ask for POLLOUT, it should be clear.
656 */
657 ATF_CHECK_EQ_MSG(nfds, 1, "nfds=%d", nfds);
658 ATF_CHECK_EQ_MSG(pfd.fd, readfd, "pfd.fd=%d readfd=%d writefd=%d",
659 pfd.fd, readfd, writefd);
660 ATF_CHECK_EQ_MSG((pfd.revents & (POLLHUP|POLLIN|POLLOUT)),
661 pollhup|POLLIN,
662 "revents=0x%x expected=0x%x"
663 " POLLHUP=0x%x POLLIN=0x%x POLLOUT=0x%x",
664 pfd.revents, pollhup|POLLIN, POLLHUP, POLLIN, POLLOUT);
665
666 /*
667 * We should have slept at least 1sec.
668 */
669 timespecsub(&end, &start, &delta);
670 ATF_CHECK_MSG(delta.tv_sec >= 1,
671 "slept only %lld.%09ld", (long long)delta.tv_sec, delta.tv_nsec);
672
673 /*
674 * Read should return EOF now -- and continue to do so.
675 */
676 check_read_eof(readfd);
677 check_read_eof(readfd);
678
679 /*
680 * POLLHUP|POLLIN state should be persistent (until the writer
681 * side is reopened if possible, as in a named pipe).
682 */
683 pfd = (struct pollfd) { .fd = readfd, .events = POLLIN };
684 RL(nfds = poll(&pfd, 1, 0));
685 ATF_CHECK_EQ_MSG(nfds, 1, "nfds=%d", nfds);
686 ATF_CHECK_EQ_MSG(pfd.fd, readfd, "pfd.fd=%d readfd=%d writefd=%d",
687 pfd.fd, readfd, writefd);
688 ATF_CHECK_EQ_MSG((pfd.revents & (POLLHUP|POLLIN|POLLOUT)),
689 pollhup|POLLIN,
690 "revents=0x%x expected=0x%x"
691 " POLLHUP=0x%x POLLIN=0x%x POLLOUT=0x%x",
692 pfd.revents, pollhup|POLLIN, POLLHUP, POLLIN, POLLOUT);
693 }
694
695 static void
696 check_pollclosed_delayed_read_devfifopipe(int readfd, int writefd)
697 {
698
699 check_pollclosed_delayed_read(readfd, writefd, POLLHUP);
700 }
701
702 static void
703 check_pollclosed_delayed_read_socket(int readfd, int writefd)
704 {
705
706 check_pollclosed_delayed_read(readfd, writefd, /*no POLLHUP*/0);
707 }
708
709 static void
710 check_pollclosed_delayed_process(int pollfd, int closefd,
711 void (*check_pollhup)(int, int))
712 {
713 pid_t pid;
714 int status;
715
716 /*
717 * Fork a child to close closefd after a 2sec delay.
718 */
719 RL(pid = fork());
720 if (pid == 0) {
721 sleep(2);
722 fprintf(stderr, "[child] close %d\n", closefd);
723 if (close(closefd) == -1)
724 _exit(1);
725 _exit(0);
726 }
727
728 /*
729 * Close closefd in the parent so the child has the last
730 * reference to it.
731 */
732 fprintf(stderr, "[parent] close %d\n", closefd);
733 RL(close(closefd));
734
735 /*
736 * Test poll(2).
737 */
738 (*check_pollhup)(pollfd, closefd);
739
740 /*
741 * Wait for the child and make sure it exited successfully.
742 */
743 RL(waitpid(pid, &status, 0));
744 ATF_CHECK_EQ_MSG(status, 0, "child exited with status 0x%x", status);
745 }
746
747 static void *
748 check_pollclosed_thread(void *cookie)
749 {
750 int *closefdp = cookie;
751
752 sleep(2);
753 fprintf(stderr, "[thread] close %d\n", *closefdp);
754 RL(close(*closefdp));
755 return NULL;
756 }
757
758 static void
759 check_pollclosed_delayed_thread(int pollfd, int closefd,
760 void (*check_pollhup)(int, int))
761 {
762 pthread_t t;
763
764 /*
765 * Create a thread to close closefd (in this process, not a
766 * child) after a 2sec delay.
767 */
768 RZ(pthread_create(&t, NULL, &check_pollclosed_thread, &closefd));
769
770 /*
771 * Test poll(2).
772 */
773 (*check_pollhup)(pollfd, closefd);
774
775 /*
776 * Wait for the thread to complete.
777 */
778 RZ(pthread_join(t, NULL));
779 }
780
781 static void
782 check_pollclosed_immediate_write(int writefd, int readfd, int expected,
783 int writeerror)
784 {
785 struct pollfd pfd = { .fd = writefd, .events = POLLOUT };
786 int nfds;
787
788 /*
789 * Close the reader side immediately.
790 */
791 fprintf(stderr, "[immediate] close %d\n", readfd);
792 RL(close(readfd));
793
794 /*
795 * The reader has been closed, so write will fail immediately
796 * with EPIPE/SIGPIPE, and thus POLLOUT must be set. POLLHUP
797 * is only returned for reads, not for writes (and is mutually
798 * exclusive with POLLOUT). Except we _do_ return POLLHUP
799 * instead of POLLOUT for terminals.
800 */
801 RL(nfds = poll(&pfd, 1, 0));
802 ATF_CHECK_EQ_MSG(nfds, 1, "nfds=%d", nfds);
803 ATF_CHECK_EQ_MSG(pfd.fd, writefd, "pfd.fd=%d writefd=%d",
804 pfd.fd, writefd);
805 ATF_CHECK_EQ_MSG((pfd.revents & (POLLHUP|POLLIN|POLLOUT)), expected,
806 "revents=0x%x expected=0x%x"
807 " POLLHUP=0x%x POLLIN=0x%x POLLOUT=0x%x",
808 pfd.revents, expected, POLLOUT, POLLHUP, POLLIN);
809
810 /*
811 * Write should fail with EPIPE/SIGPIPE now -- and continue to
812 * do so.
813 */
814 check_write_fail(writefd, writeerror);
815 check_write_fail(writefd, writeerror);
816 }
817
818 static void
819 check_pollclosed_immediate_readnone(int readfd, int writefd, int pollhup)
820 {
821 struct pollfd pfd = { .fd = readfd, .events = POLLIN };
822 int nfds;
823
824 /*
825 * Close the writer side immediately.
826 */
827 fprintf(stderr, "[immediate] close %d\n", writefd);
828 RL(close(writefd));
829
830 /*
831 * Read will yield EOF without blocking, so POLLIN should be
832 * set, and the write side has been closed, so POLLHUP should
833 * be set, unsolicited, if this is a pipe or FIFO -- but not if
834 * it's a socket, where POLLHUP is never set. Since we didn't
835 * ask for POLLOUT, it should be clear.
836 */
837 RL(nfds = poll(&pfd, 1, 0));
838 ATF_CHECK_EQ_MSG(nfds, 1, "nfds=%d", nfds);
839 ATF_CHECK_EQ_MSG((pfd.revents & (POLLHUP|POLLIN|POLLOUT)),
840 pollhup|POLLIN,
841 "revents=0x%x expected=0x%x"
842 " POLLHUP=0x%x POLLIN=0x%x POLLOUT=0x%x",
843 pfd.revents, pollhup|POLLIN, POLLHUP, POLLIN, POLLOUT);
844
845 /*
846 * Read should return EOF now -- and continue to do so.
847 */
848 check_read_eof(readfd);
849 check_read_eof(readfd);
850 }
851
852 static void
853 check_pollclosed_immediate_readsome(int readfd, int writefd, int pollhup)
854 {
855 struct pollfd pfd;
856 char buf[BUFSIZ];
857 ssize_t nread;
858 int nfds;
859
860 /*
861 * Close the writer side immediately.
862 */
863 fprintf(stderr, "[immediate] close %d\n", writefd);
864 RL(close(writefd));
865
866 /*
867 * Some data should be ready to read, so POLLIN should be set,
868 * and the write side has been closed, so POLLHUP should also
869 * be set, unsolicited, if this is a pipe or FIFO -- but not if
870 * it's a socket, where POLLHUP is never set. Since we didn't
871 * ask for POLLOUT, it should be clear.
872 */
873 pfd = (struct pollfd) { .fd = readfd, .events = POLLIN };
874 RL(nfds = poll(&pfd, 1, 0));
875 ATF_CHECK_EQ_MSG(nfds, 1, "nfds=%d", nfds);
876 ATF_CHECK_EQ_MSG((pfd.revents & (POLLHUP|POLLIN|POLLOUT)),
877 pollhup|POLLIN,
878 "revents=0x%x expected=0x%x"
879 " POLLHUP=0x%x POLLIN=0x%x POLLOUT=0x%x",
880 pfd.revents, pollhup|POLLIN, POLLHUP, POLLIN, POLLOUT);
881
882 /*
883 * Read all the data. Each read should complete instantly --
884 * no blocking, either because there's data to read or because
885 * the writer has hung up and we get EOF.
886 */
887 do {
888 REQUIRE_LIBC(alarm(1), (unsigned)-1);
889 RL(nread = read(readfd, buf, sizeof(buf)));
890 REQUIRE_LIBC(alarm(0), (unsigned)-1);
891 } while (nread != 0);
892
893 /*
894 * Read will yield EOF without blocking, so POLLIN should be
895 * set, and the write side has been closed, so POLLHUP should
896 * also be set, unsolicited, if this is a pipe or FIFO -- but
897 * not if it's a socket, where POLLHUP is never set. Since we
898 * didn't ask for POLLOUT, it should be clear.
899 */
900 pfd = (struct pollfd) { .fd = readfd, .events = POLLIN };
901 RL(nfds = poll(&pfd, 1, 0));
902 ATF_CHECK_EQ_MSG(nfds, 1, "nfds=%d", nfds);
903 ATF_CHECK_EQ_MSG((pfd.revents & (POLLHUP|POLLIN|POLLOUT)),
904 pollhup|POLLIN,
905 "revents=0x%x expected=0x%x"
906 " POLLHUP=0x%x POLLIN=0x%x POLLOUT=0x%x",
907 pfd.revents, pollhup|POLLIN, POLLHUP, POLLIN, POLLOUT);
908
909 /*
910 * Read should return EOF now -- and continue to do so.
911 */
912 check_read_eof(readfd);
913 check_read_eof(readfd);
914
915 /*
916 * POLLHUP|POLLIN state should be persistent (until the writer
917 * side is reopened if possible, as in a named pipe).
918 */
919 pfd = (struct pollfd) { .fd = readfd, .events = POLLIN };
920 RL(nfds = poll(&pfd, 1, 0));
921 ATF_CHECK_EQ_MSG(nfds, 1, "nfds=%d", nfds);
922 ATF_CHECK_EQ_MSG((pfd.revents & (POLLHUP|POLLIN|POLLOUT)),
923 pollhup|POLLIN,
924 "revents=0x%x expected=0x%x"
925 " POLLHUP=0x%x POLLIN=0x%x POLLOUT=0x%x",
926 pfd.revents, pollhup|POLLIN, POLLHUP, POLLIN, POLLOUT);
927 }
928
929 static void *
930 pollclosed_fifo_writer_thread(void *cookie)
931 {
932 int *pp = cookie;
933
934 RL(*pp = open(fifo_path, O_WRONLY));
935 return NULL;
936 }
937
938 static void *
939 pollclosed_fifo_reader_thread(void *cookie)
940 {
941 int *pp = cookie;
942
943 RL(*pp = open(fifo_path, O_RDONLY));
944 return NULL;
945 }
946
947 static void
948 pollclosed_fifo0_setup(int *writefdp, int *readfdp)
949 {
950 int p0, p1;
951 pthread_t t;
952
953 fifo_support();
954
955 RL(mkfifo(fifo_path, 0600));
956 RZ(pthread_create(&t, NULL, &pollclosed_fifo_reader_thread, &p0));
957 REQUIRE_LIBC(alarm(1), (unsigned)-1);
958 RL(p1 = open(fifo_path, O_WRONLY));
959 REQUIRE_LIBC(alarm(0), (unsigned)-1);
960 RZ(pthread_join(t, NULL));
961
962 *writefdp = p1;
963 *readfdp = p0;
964 }
965
966 static void
967 pollclosed_fifo1_setup(int *writefdp, int *readfdp)
968 {
969 int p0, p1;
970 pthread_t t;
971
972 fifo_support();
973
974 RL(mkfifo(fifo_path, 0600));
975 RZ(pthread_create(&t, NULL, &pollclosed_fifo_writer_thread, &p0));
976 REQUIRE_LIBC(alarm(1), (unsigned)-1);
977 RL(p1 = open(fifo_path, O_RDONLY));
978 REQUIRE_LIBC(alarm(0), (unsigned)-1);
979 RZ(pthread_join(t, NULL));
980
981 *writefdp = p0;
982 *readfdp = p1;
983 }
984
985 static void
986 pollclosed_pipe_setup(int *writefdp, int *readfdp)
987 {
988 int p[2];
989
990 RL(pipe(p));
991
992 *readfdp = p[0]; /* reader side */
993 *writefdp = p[1]; /* writer side */
994 }
995
996 static void
997 pollclosed_ptyapp_setup(int *writefdp, int *readfdp)
998 {
999 int hostfd, appfd;
1000 struct termios t;
1001 char *pts;
1002
1003 RL(hostfd = posix_openpt(O_RDWR|O_NOCTTY));
1004 RL(grantpt(hostfd));
1005 RL(unlockpt(hostfd));
1006 REQUIRE_LIBC(pts = ptsname(hostfd), NULL);
1007 RL(appfd = open(pts, O_RDWR|O_NOCTTY));
1008
1009 RL(tcgetattr(appfd, &t));
1010 t.c_lflag &= ~ICANON; /* block rather than drop input */
1011 RL(tcsetattr(appfd, TCSANOW, &t));
1012
1013 *readfdp = appfd;
1014 *writefdp = hostfd;
1015 }
1016
1017 static void
1018 pollclosed_ptyhost_setup(int *writefdp, int *readfdp)
1019 {
1020 int hostfd, appfd;
1021 struct termios t;
1022 char *pts;
1023
1024 RL(hostfd = posix_openpt(O_RDWR|O_NOCTTY));
1025 RL(grantpt(hostfd));
1026 RL(unlockpt(hostfd));
1027 REQUIRE_LIBC(pts = ptsname(hostfd), NULL);
1028 RL(appfd = open(pts, O_RDWR|O_NOCTTY));
1029
1030 RL(tcgetattr(appfd, &t));
1031 t.c_lflag &= ~ICANON; /* block rather than drop input */
1032 RL(tcsetattr(appfd, TCSANOW, &t));
1033
1034 *writefdp = appfd;
1035 *readfdp = hostfd;
1036 }
1037
1038 static void
1039 pollclosed_socketpair0_setup(int *writefdp, int *readfdp)
1040 {
1041 int s[2];
1042
1043 RL(socketpair(AF_LOCAL, SOCK_STREAM, 0, s));
1044 *readfdp = s[0];
1045 *writefdp = s[1];
1046 }
1047
1048 static void
1049 pollclosed_socketpair1_setup(int *writefdp, int *readfdp)
1050 {
1051 int s[2];
1052
1053 RL(socketpair(AF_LOCAL, SOCK_STREAM, 0, s));
1054 *readfdp = s[1];
1055 *writefdp = s[0];
1056 }
1057
1058 /*
1059 * Cartesian product of:
1060 *
1061 * 1. [fifo0] first fifo opener
1062 * 2. [fifo1] second fifo opener
1063 * 3. [pipe] pipe
1064 * 4. [ptyhost] host side of pty
1065 * 5. [ptyapp] application side of pty
1066 * 6. [socketpair0] first side of socket pair
1067 * 7. [socketpair1] second side of socket pair
1068 *
1069 * with
1070 *
1071 * 1. [immediate] closed before poll starts
1072 * 2. [delayed_thread] closed by another thread after poll starts
1073 * 3. [delayed_process] closed by another process after poll starts
1074 *
1075 * with
1076 *
1077 * 1. [writefull] close reader, poll for write when buffer full
1078 * 2. [writeempty] close reader, poll for write when buffer empty
1079 * 3. [readnone] close writer, poll for read when nothing to read
1080 * 4. [readsome] close writer, poll for read when something to read
1081 *
1082 * except that in the delayed cases we only do writefull [write] and
1083 * readnone [read], because there's no delay in the writeempty/readsome
1084 * cases.
1085 */
1086
1087 ATF_TC(pollclosed_fifo0_immediate_writefull);
1088 ATF_TC_HEAD(pollclosed_fifo0_immediate_writefull, tc)
1089 {
1090 atf_tc_set_md_var(tc, "descr",
1091 "Checks POLLHUP with closing the first opener of a named pipe");
1092 }
1093 ATF_TC_BODY(pollclosed_fifo0_immediate_writefull, tc)
1094 {
1095 int writefd, readfd;
1096
1097 pollclosed_fifo0_setup(&writefd, &readfd);
1098 fillpipebuf(writefd);
1099 check_pollclosed_immediate_write(writefd, readfd, POLLOUT, EPIPE);
1100 }
1101
1102 ATF_TC(pollclosed_fifo0_immediate_writeempty);
1103 ATF_TC_HEAD(pollclosed_fifo0_immediate_writeempty, tc)
1104 {
1105 atf_tc_set_md_var(tc, "descr",
1106 "Checks POLLHUP with closing the first opener of a named pipe");
1107 }
1108 ATF_TC_BODY(pollclosed_fifo0_immediate_writeempty, tc)
1109 {
1110 int writefd, readfd;
1111
1112 pollclosed_fifo0_setup(&writefd, &readfd);
1113 /* don't fill the pipe buf */
1114 check_pollclosed_immediate_write(writefd, readfd, POLLOUT, EPIPE);
1115 }
1116
1117 ATF_TC(pollclosed_fifo0_immediate_readsome);
1118 ATF_TC_HEAD(pollclosed_fifo0_immediate_readsome, tc)
1119 {
1120 atf_tc_set_md_var(tc, "descr",
1121 "Checks POLLHUP with closing the first opener of a named pipe");
1122 }
1123 ATF_TC_BODY(pollclosed_fifo0_immediate_readsome, tc)
1124 {
1125 int writefd, readfd;
1126
1127 /*
1128 * poll(2) returns nothing, when it is supposed to return
1129 * POLLHUP|POLLIN.
1130 */
1131 atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
1132
1133 pollclosed_fifo1_setup(&writefd, &readfd); /* reverse r/w */
1134 fillpipebuf(writefd);
1135 check_pollclosed_immediate_readsome(readfd, writefd, POLLHUP);
1136 }
1137
1138 ATF_TC(pollclosed_fifo0_immediate_readnone);
1139 ATF_TC_HEAD(pollclosed_fifo0_immediate_readnone, tc)
1140 {
1141 atf_tc_set_md_var(tc, "descr",
1142 "Checks POLLHUP with closing the first opener of a named pipe");
1143 }
1144 ATF_TC_BODY(pollclosed_fifo0_immediate_readnone, tc)
1145 {
1146 int writefd, readfd;
1147
1148 pollclosed_fifo1_setup(&writefd, &readfd); /* reverse r/w */
1149 /* don't fill the pipe buf */
1150 check_pollclosed_immediate_readnone(readfd, writefd, POLLHUP);
1151 }
1152
1153 ATF_TC(pollclosed_fifo0_delayed_process_write);
1154 ATF_TC_HEAD(pollclosed_fifo0_delayed_process_write, tc)
1155 {
1156 atf_tc_set_md_var(tc, "descr",
1157 "Checks POLLHUP with closing the first opener of a named pipe");
1158 }
1159 ATF_TC_BODY(pollclosed_fifo0_delayed_process_write, tc)
1160 {
1161 int writefd, readfd;
1162
1163 pollclosed_fifo0_setup(&writefd, &readfd);
1164 fillpipebuf(writefd);
1165 check_pollclosed_delayed_process(writefd, readfd,
1166 &check_pollclosed_delayed_write_fifopipesocket);
1167 }
1168
1169 ATF_TC(pollclosed_fifo0_delayed_process_read);
1170 ATF_TC_HEAD(pollclosed_fifo0_delayed_process_read, tc)
1171 {
1172 atf_tc_set_md_var(tc, "descr",
1173 "Checks POLLHUP with closing the first opener of a named pipe");
1174 }
1175 ATF_TC_BODY(pollclosed_fifo0_delayed_process_read, tc)
1176 {
1177 int writefd, readfd;
1178
1179 /*
1180 * poll(2) wakes up with POLLHUP|POLLIN, but the state isn't
1181 * persistent as it is supposed to be -- it returns nothing
1182 * after that.
1183 */
1184 atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
1185
1186 pollclosed_fifo1_setup(&writefd, &readfd); /* reverse r/w */
1187 /* don't fill pipe buf */
1188 check_pollclosed_delayed_process(readfd, writefd,
1189 &check_pollclosed_delayed_read_devfifopipe);
1190 }
1191
1192 ATF_TC(pollclosed_fifo0_delayed_thread_write);
1193 ATF_TC_HEAD(pollclosed_fifo0_delayed_thread_write, tc)
1194 {
1195 atf_tc_set_md_var(tc, "descr",
1196 "Checks POLLHUP with closing the first opener of a named pipe");
1197 }
1198 ATF_TC_BODY(pollclosed_fifo0_delayed_thread_write, tc)
1199 {
1200 int writefd, readfd;
1201
1202 pollclosed_fifo0_setup(&writefd, &readfd);
1203 fillpipebuf(writefd);
1204 check_pollclosed_delayed_thread(writefd, readfd,
1205 &check_pollclosed_delayed_write_fifopipesocket);
1206 }
1207
1208 ATF_TC(pollclosed_fifo0_delayed_thread_read);
1209 ATF_TC_HEAD(pollclosed_fifo0_delayed_thread_read, tc)
1210 {
1211 atf_tc_set_md_var(tc, "descr",
1212 "Checks POLLHUP with closing the first opener of a named pipe");
1213 }
1214 ATF_TC_BODY(pollclosed_fifo0_delayed_thread_read, tc)
1215 {
1216 int writefd, readfd;
1217
1218 /*
1219 * poll(2) wakes up with POLLHUP|POLLIN, but the state isn't
1220 * persistent as it is supposed to be -- it returns nothing
1221 * after that.
1222 */
1223 atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
1224
1225 pollclosed_fifo1_setup(&writefd, &readfd); /* reverse r/w */
1226 /* don't fill pipe buf */
1227 check_pollclosed_delayed_thread(readfd, writefd,
1228 &check_pollclosed_delayed_read_devfifopipe);
1229 }
1230
1231 ATF_TC(pollclosed_fifo1_immediate_writefull);
1232 ATF_TC_HEAD(pollclosed_fifo1_immediate_writefull, tc)
1233 {
1234 atf_tc_set_md_var(tc, "descr",
1235 "Checks POLLHUP with closing the second opener of a named pipe");
1236 }
1237 ATF_TC_BODY(pollclosed_fifo1_immediate_writefull, tc)
1238 {
1239 int writefd, readfd;
1240
1241 pollclosed_fifo1_setup(&writefd, &readfd);
1242 fillpipebuf(writefd);
1243 check_pollclosed_immediate_write(writefd, readfd, POLLOUT, EPIPE);
1244 }
1245
1246 ATF_TC(pollclosed_fifo1_immediate_writeempty);
1247 ATF_TC_HEAD(pollclosed_fifo1_immediate_writeempty, tc)
1248 {
1249 atf_tc_set_md_var(tc, "descr",
1250 "Checks POLLHUP with closing the second opener of a named pipe");
1251 }
1252 ATF_TC_BODY(pollclosed_fifo1_immediate_writeempty, tc)
1253 {
1254 int writefd, readfd;
1255
1256 pollclosed_fifo1_setup(&writefd, &readfd);
1257 /* don't fill the pipe buf */
1258 check_pollclosed_immediate_write(writefd, readfd, POLLOUT, EPIPE);
1259 }
1260
1261 ATF_TC(pollclosed_fifo1_immediate_readsome);
1262 ATF_TC_HEAD(pollclosed_fifo1_immediate_readsome, tc)
1263 {
1264 atf_tc_set_md_var(tc, "descr",
1265 "Checks POLLHUP with closing the second opener of a named pipe");
1266 }
1267 ATF_TC_BODY(pollclosed_fifo1_immediate_readsome, tc)
1268 {
1269 int writefd, readfd;
1270
1271 /*
1272 * poll(2) returns nothing, when it is supposed to return
1273 * POLLHUP|POLLIN.
1274 */
1275 atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
1276
1277 pollclosed_fifo0_setup(&writefd, &readfd); /* reverse r/w */
1278 fillpipebuf(writefd);
1279 check_pollclosed_immediate_readsome(readfd, writefd, POLLHUP);
1280 }
1281
1282 ATF_TC(pollclosed_fifo1_immediate_readnone);
1283 ATF_TC_HEAD(pollclosed_fifo1_immediate_readnone, tc)
1284 {
1285 atf_tc_set_md_var(tc, "descr",
1286 "Checks POLLHUP with closing the second opener of a named pipe");
1287 }
1288 ATF_TC_BODY(pollclosed_fifo1_immediate_readnone, tc)
1289 {
1290 int writefd, readfd;
1291
1292 pollclosed_fifo0_setup(&writefd, &readfd); /* reverse r/w */
1293 /* don't fill the pipe buf */
1294 check_pollclosed_immediate_readnone(readfd, writefd, POLLHUP);
1295 }
1296
1297 ATF_TC(pollclosed_fifo1_delayed_process_write);
1298 ATF_TC_HEAD(pollclosed_fifo1_delayed_process_write, tc)
1299 {
1300 atf_tc_set_md_var(tc, "descr",
1301 "Checks POLLHUP with closing the second opener of a named pipe");
1302 }
1303 ATF_TC_BODY(pollclosed_fifo1_delayed_process_write, tc)
1304 {
1305 int writefd, readfd;
1306
1307 pollclosed_fifo1_setup(&writefd, &readfd);
1308 fillpipebuf(writefd);
1309 check_pollclosed_delayed_process(writefd, readfd,
1310 &check_pollclosed_delayed_write_fifopipesocket);
1311 }
1312
1313 ATF_TC(pollclosed_fifo1_delayed_process_read);
1314 ATF_TC_HEAD(pollclosed_fifo1_delayed_process_read, tc)
1315 {
1316 atf_tc_set_md_var(tc, "descr",
1317 "Checks POLLHUP with closing the second opener of a named pipe");
1318 }
1319 ATF_TC_BODY(pollclosed_fifo1_delayed_process_read, tc)
1320 {
1321 int writefd, readfd;
1322
1323 /*
1324 * poll(2) wakes up with POLLHUP|POLLIN, but the state isn't
1325 * persistent as it is supposed to be -- it returns nothing
1326 * after that.
1327 */
1328 atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
1329
1330 pollclosed_fifo0_setup(&writefd, &readfd); /* reverse r/w */
1331 /* don't fill pipe buf */
1332 check_pollclosed_delayed_process(readfd, writefd,
1333 &check_pollclosed_delayed_read_devfifopipe);
1334 }
1335
1336 ATF_TC(pollclosed_fifo1_delayed_thread_write);
1337 ATF_TC_HEAD(pollclosed_fifo1_delayed_thread_write, tc)
1338 {
1339 atf_tc_set_md_var(tc, "descr",
1340 "Checks POLLHUP with closing the second opener of a named pipe");
1341 }
1342 ATF_TC_BODY(pollclosed_fifo1_delayed_thread_write, tc)
1343 {
1344 int writefd, readfd;
1345
1346 pollclosed_fifo1_setup(&writefd, &readfd);
1347 fillpipebuf(writefd);
1348 check_pollclosed_delayed_thread(writefd, readfd,
1349 &check_pollclosed_delayed_write_fifopipesocket);
1350 }
1351
1352 ATF_TC(pollclosed_fifo1_delayed_thread_read);
1353 ATF_TC_HEAD(pollclosed_fifo1_delayed_thread_read, tc)
1354 {
1355 atf_tc_set_md_var(tc, "descr",
1356 "Checks POLLHUP with closing the second opener of a named pipe");
1357 }
1358 ATF_TC_BODY(pollclosed_fifo1_delayed_thread_read, tc)
1359 {
1360 int writefd, readfd;
1361
1362 /*
1363 * poll(2) wakes up with POLLHUP|POLLIN, but the state isn't
1364 * persistent as it is supposed to be -- it returns nothing
1365 * after that.
1366 */
1367 atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
1368
1369 pollclosed_fifo0_setup(&writefd, &readfd); /* reverse r/w */
1370 /* don't fill pipe buf */
1371 check_pollclosed_delayed_process(readfd, writefd,
1372 &check_pollclosed_delayed_read_devfifopipe);
1373 }
1374
1375 ATF_TC(pollclosed_pipe_immediate_writefull);
1376 ATF_TC_HEAD(pollclosed_pipe_immediate_writefull, tc)
1377 {
1378 atf_tc_set_md_var(tc, "descr",
1379 "Checks POLLHUP with a closed pipe");
1380 }
1381 ATF_TC_BODY(pollclosed_pipe_immediate_writefull, tc)
1382 {
1383 int writefd, readfd;
1384
1385 /*
1386 * poll(2) returns POLLHUP|POLLOUT, which is forbidden --
1387 * POLLHUP and POLLOUT are mutually exclusive. And POLLHUP is
1388 * only supposed to be returned by polling for read, not
1389 * polling for write. So it should be POLLOUT.
1390 */
1391 atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
1392
1393 pollclosed_pipe_setup(&writefd, &readfd);
1394 fillpipebuf(writefd);
1395 check_pollclosed_immediate_write(writefd, readfd, POLLOUT, EPIPE);
1396 }
1397
1398 ATF_TC(pollclosed_pipe_immediate_writeempty);
1399 ATF_TC_HEAD(pollclosed_pipe_immediate_writeempty, tc)
1400 {
1401 atf_tc_set_md_var(tc, "descr",
1402 "Checks POLLHUP with a closed pipe");
1403 }
1404 ATF_TC_BODY(pollclosed_pipe_immediate_writeempty, tc)
1405 {
1406 int writefd, readfd;
1407
1408 /*
1409 * poll(2) returns POLLHUP|POLLOUT, which is forbidden --
1410 * POLLHUP and POLLOUT are mutually exclusive. And POLLHUP is
1411 * only supposed to be returned by polling for read, not
1412 * polling for write. So it should be POLLOUT.
1413 */
1414 atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
1415
1416 pollclosed_pipe_setup(&writefd, &readfd);
1417 /* don't fill pipe buf */
1418 check_pollclosed_immediate_write(writefd, readfd, POLLOUT, EPIPE);
1419 }
1420
1421 ATF_TC(pollclosed_pipe_immediate_readsome);
1422 ATF_TC_HEAD(pollclosed_pipe_immediate_readsome, tc)
1423 {
1424 atf_tc_set_md_var(tc, "descr",
1425 "Checks POLLHUP with a closed pipe");
1426 }
1427 ATF_TC_BODY(pollclosed_pipe_immediate_readsome, tc)
1428 {
1429 int writefd, readfd;
1430
1431 pollclosed_pipe_setup(&writefd, &readfd);
1432 fillpipebuf(writefd);
1433 check_pollclosed_immediate_readsome(readfd, writefd, POLLHUP);
1434 }
1435
1436 ATF_TC(pollclosed_pipe_immediate_readnone);
1437 ATF_TC_HEAD(pollclosed_pipe_immediate_readnone, tc)
1438 {
1439 atf_tc_set_md_var(tc, "descr",
1440 "Checks POLLHUP with a closed pipe");
1441 }
1442 ATF_TC_BODY(pollclosed_pipe_immediate_readnone, tc)
1443 {
1444 int writefd, readfd;
1445
1446 pollclosed_pipe_setup(&writefd, &readfd);
1447 /* don't fill pipe buf */
1448 check_pollclosed_immediate_readnone(readfd, writefd, POLLHUP);
1449 }
1450
1451 ATF_TC(pollclosed_pipe_delayed_process_write);
1452 ATF_TC_HEAD(pollclosed_pipe_delayed_process_write, tc)
1453 {
1454 atf_tc_set_md_var(tc, "descr",
1455 "Checks POLLHUP with a closed pipe");
1456 }
1457 ATF_TC_BODY(pollclosed_pipe_delayed_process_write, tc)
1458 {
1459 int writefd, readfd;
1460
1461 /*
1462 * poll(2) returns POLLHUP|POLLOUT, which is forbidden --
1463 * POLLHUP and POLLOUT are mutually exclusive. And POLLHUP is
1464 * only supposed to be returned by polling for read, not
1465 * polling for write. So it should be POLLOUT.
1466 */
1467 atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
1468
1469 pollclosed_pipe_setup(&writefd, &readfd);
1470 fillpipebuf(writefd);
1471 check_pollclosed_delayed_process(writefd, readfd,
1472 &check_pollclosed_delayed_write_fifopipesocket);
1473 }
1474
1475 ATF_TC(pollclosed_pipe_delayed_process_read);
1476 ATF_TC_HEAD(pollclosed_pipe_delayed_process_read, tc)
1477 {
1478 atf_tc_set_md_var(tc, "descr",
1479 "Checks POLLHUP with a closed pipe");
1480 }
1481 ATF_TC_BODY(pollclosed_pipe_delayed_process_read, tc)
1482 {
1483 int writefd, readfd;
1484
1485 pollclosed_pipe_setup(&writefd, &readfd);
1486 /* don't fill pipe buf */
1487 check_pollclosed_delayed_process(readfd, writefd,
1488 &check_pollclosed_delayed_read_devfifopipe);
1489 }
1490
1491 ATF_TC(pollclosed_pipe_delayed_thread_write);
1492 ATF_TC_HEAD(pollclosed_pipe_delayed_thread_write, tc)
1493 {
1494 atf_tc_set_md_var(tc, "descr",
1495 "Checks POLLHUP with a closed pipe");
1496 }
1497 ATF_TC_BODY(pollclosed_pipe_delayed_thread_write, tc)
1498 {
1499 int writefd, readfd;
1500
1501 /*
1502 * poll(2) returns POLLHUP|POLLOUT, which is forbidden --
1503 * POLLHUP and POLLOUT are mutually exclusive. And POLLHUP is
1504 * only supposed to be returned by polling for read, not
1505 * polling for write. So it should be POLLOUT.
1506 */
1507 atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
1508
1509 pollclosed_pipe_setup(&writefd, &readfd);
1510 fillpipebuf(writefd);
1511 check_pollclosed_delayed_thread(writefd, readfd,
1512 &check_pollclosed_delayed_write_fifopipesocket);
1513 }
1514
1515 ATF_TC(pollclosed_pipe_delayed_thread_read);
1516 ATF_TC_HEAD(pollclosed_pipe_delayed_thread_read, tc)
1517 {
1518 atf_tc_set_md_var(tc, "descr",
1519 "Checks POLLHUP with a closed pipe");
1520 }
1521 ATF_TC_BODY(pollclosed_pipe_delayed_thread_read, tc)
1522 {
1523 int writefd, readfd;
1524
1525 pollclosed_pipe_setup(&writefd, &readfd);
1526 /* don't fill pipe buf */
1527 check_pollclosed_delayed_thread(readfd, writefd,
1528 &check_pollclosed_delayed_read_devfifopipe);
1529 }
1530
1531 ATF_TC(pollclosed_ptyapp_immediate_writefull);
1532 ATF_TC_HEAD(pollclosed_ptyapp_immediate_writefull, tc)
1533 {
1534 atf_tc_set_md_var(tc, "descr",
1535 "Checks POLLHUP with closing the pty application side");
1536 }
1537 ATF_TC_BODY(pollclosed_ptyapp_immediate_writefull, tc)
1538 {
1539 int writefd, readfd;
1540
1541 pollclosed_ptyapp_setup(&writefd, &readfd);
1542 fillpipebuf(writefd);
1543 check_pollclosed_immediate_write(writefd, readfd, POLLHUP, EIO);
1544 }
1545
1546 ATF_TC(pollclosed_ptyapp_immediate_writeempty);
1547 ATF_TC_HEAD(pollclosed_ptyapp_immediate_writeempty, tc)
1548 {
1549 atf_tc_set_md_var(tc, "descr",
1550 "Checks POLLHUP with closing the pty application side");
1551 }
1552 ATF_TC_BODY(pollclosed_ptyapp_immediate_writeempty, tc)
1553 {
1554 int writefd, readfd;
1555
1556 pollclosed_ptyapp_setup(&writefd, &readfd);
1557 /* don't fill the pipe buf */
1558 check_pollclosed_immediate_write(writefd, readfd, POLLHUP, EIO);
1559 }
1560
1561 ATF_TC(pollclosed_ptyapp_immediate_readsome);
1562 ATF_TC_HEAD(pollclosed_ptyapp_immediate_readsome, tc)
1563 {
1564 atf_tc_set_md_var(tc, "descr",
1565 "Checks POLLHUP with closing the pty application side");
1566 }
1567 ATF_TC_BODY(pollclosed_ptyapp_immediate_readsome, tc)
1568 {
1569 int writefd, readfd;
1570
1571 /*
1572 * poll(2) returns POLLHUP but not POLLIN even though read(2)
1573 * would return EOF without blocking.
1574 */
1575 atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
1576
1577 pollclosed_ptyhost_setup(&writefd, &readfd); /* reverse r/w */
1578 fillpipebuf(writefd);
1579 check_pollclosed_immediate_readsome(readfd, writefd, POLLHUP);
1580 }
1581
1582 ATF_TC(pollclosed_ptyapp_immediate_readnone);
1583 ATF_TC_HEAD(pollclosed_ptyapp_immediate_readnone, tc)
1584 {
1585 atf_tc_set_md_var(tc, "descr",
1586 "Checks POLLHUP with closing the pty application side");
1587 }
1588 ATF_TC_BODY(pollclosed_ptyapp_immediate_readnone, tc)
1589 {
1590 int writefd, readfd;
1591
1592 /*
1593 * poll(2) returns POLLHUP but not POLLIN even though read(2)
1594 * would return EOF without blocking.
1595 */
1596 atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
1597
1598 pollclosed_ptyhost_setup(&writefd, &readfd); /* reverse r/w */
1599 /* don't fill the pipe buf */
1600 check_pollclosed_immediate_readnone(readfd, writefd, POLLHUP);
1601 }
1602
1603 ATF_TC(pollclosed_ptyapp_delayed_process_write);
1604 ATF_TC_HEAD(pollclosed_ptyapp_delayed_process_write, tc)
1605 {
1606 atf_tc_set_md_var(tc, "descr",
1607 "Checks POLLHUP with closing the pty application side");
1608 }
1609 ATF_TC_BODY(pollclosed_ptyapp_delayed_process_write, tc)
1610 {
1611 int writefd, readfd;
1612
1613 /*
1614 * The poll(2) call is not woken by the concurrent close(2)
1615 * call.
1616 */
1617 atf_tc_expect_signal(SIGALRM, "PR kern/59056: poll POLLHUP bugs");
1618
1619 pollclosed_ptyapp_setup(&writefd, &readfd);
1620 fillpipebuf(writefd);
1621 check_pollclosed_delayed_process(writefd, readfd,
1622 &check_pollclosed_delayed_write_terminal);
1623 }
1624
1625 ATF_TC(pollclosed_ptyapp_delayed_process_read);
1626 ATF_TC_HEAD(pollclosed_ptyapp_delayed_process_read, tc)
1627 {
1628 atf_tc_set_md_var(tc, "descr",
1629 "Checks POLLHUP with closing the pty application side");
1630 }
1631 ATF_TC_BODY(pollclosed_ptyapp_delayed_process_read, tc)
1632 {
1633 int writefd, readfd;
1634
1635 /*
1636 * poll(2) returns POLLHUP but not POLLIN even though read(2)
1637 * would return EOF without blocking.
1638 */
1639 atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
1640
1641 pollclosed_ptyhost_setup(&writefd, &readfd); /* reverse r/w */
1642 /* don't fill pipe buf */
1643 check_pollclosed_delayed_process(readfd, writefd,
1644 &check_pollclosed_delayed_read_devfifopipe);
1645 }
1646
1647 ATF_TC(pollclosed_ptyapp_delayed_thread_write);
1648 ATF_TC_HEAD(pollclosed_ptyapp_delayed_thread_write, tc)
1649 {
1650 atf_tc_set_md_var(tc, "descr",
1651 "Checks POLLHUP with closing the pty application side");
1652 }
1653 ATF_TC_BODY(pollclosed_ptyapp_delayed_thread_write, tc)
1654 {
1655 int writefd, readfd;
1656
1657 /*
1658 * The poll(2) call is not woken by the concurrent close(2)
1659 * call.
1660 */
1661 atf_tc_expect_signal(SIGALRM, "PR kern/59056: poll POLLHUP bugs");
1662
1663 pollclosed_ptyapp_setup(&writefd, &readfd);
1664 fillpipebuf(writefd);
1665 check_pollclosed_delayed_thread(writefd, readfd,
1666 &check_pollclosed_delayed_write_terminal);
1667 }
1668
1669 ATF_TC(pollclosed_ptyapp_delayed_thread_read);
1670 ATF_TC_HEAD(pollclosed_ptyapp_delayed_thread_read, tc)
1671 {
1672 atf_tc_set_md_var(tc, "descr",
1673 "Checks POLLHUP with closing the pty application side");
1674 }
1675 ATF_TC_BODY(pollclosed_ptyapp_delayed_thread_read, tc)
1676 {
1677 int writefd, readfd;
1678
1679 /*
1680 * poll(2) returns POLLHUP but not POLLIN even though read(2)
1681 * would return EOF without blocking.
1682 */
1683 atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
1684
1685 pollclosed_ptyhost_setup(&writefd, &readfd); /* reverse r/w */
1686 /* don't fill pipe buf */
1687 check_pollclosed_delayed_process(readfd, writefd,
1688 &check_pollclosed_delayed_read_devfifopipe);
1689 }
1690
1691 ATF_TC(pollclosed_ptyhost_immediate_writefull);
1692 ATF_TC_HEAD(pollclosed_ptyhost_immediate_writefull, tc)
1693 {
1694 atf_tc_set_md_var(tc, "descr",
1695 "Checks POLLHUP with closing the pty host side");
1696 }
1697 ATF_TC_BODY(pollclosed_ptyhost_immediate_writefull, tc)
1698 {
1699 int writefd, readfd;
1700
1701 pollclosed_ptyhost_setup(&writefd, &readfd);
1702 fillpipebuf(writefd);
1703 check_pollclosed_immediate_write(writefd, readfd, POLLHUP, EIO);
1704 }
1705
1706 ATF_TC(pollclosed_ptyhost_immediate_writeempty);
1707 ATF_TC_HEAD(pollclosed_ptyhost_immediate_writeempty, tc)
1708 {
1709 atf_tc_set_md_var(tc, "descr",
1710 "Checks POLLHUP with closing the pty host side");
1711 }
1712 ATF_TC_BODY(pollclosed_ptyhost_immediate_writeempty, tc)
1713 {
1714 int writefd, readfd;
1715
1716 pollclosed_ptyhost_setup(&writefd, &readfd);
1717 /* don't fill the pipe buf */
1718 check_pollclosed_immediate_write(writefd, readfd, POLLHUP, EIO);
1719 }
1720
1721 ATF_TC(pollclosed_ptyhost_immediate_readsome);
1722 ATF_TC_HEAD(pollclosed_ptyhost_immediate_readsome, tc)
1723 {
1724 atf_tc_set_md_var(tc, "descr",
1725 "Checks POLLHUP with closing the pty host side");
1726 }
1727 ATF_TC_BODY(pollclosed_ptyhost_immediate_readsome, tc)
1728 {
1729 int writefd, readfd;
1730
1731 /*
1732 * poll(2) returns POLLHUP but not POLLIN even though read(2)
1733 * would return EOF without blocking.
1734 */
1735 atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
1736
1737 pollclosed_ptyapp_setup(&writefd, &readfd); /* reverse r/w */
1738 fillpipebuf(writefd);
1739 check_pollclosed_immediate_readsome(readfd, writefd, POLLHUP);
1740 }
1741
1742 ATF_TC(pollclosed_ptyhost_immediate_readnone);
1743 ATF_TC_HEAD(pollclosed_ptyhost_immediate_readnone, tc)
1744 {
1745 atf_tc_set_md_var(tc, "descr",
1746 "Checks POLLHUP with closing the pty host side");
1747 }
1748 ATF_TC_BODY(pollclosed_ptyhost_immediate_readnone, tc)
1749 {
1750 int writefd, readfd;
1751
1752 /*
1753 * poll(2) returns POLLHUP but not POLLIN even though read(2)
1754 * would return EOF without blocking.
1755 */
1756 atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
1757
1758 pollclosed_ptyapp_setup(&writefd, &readfd); /* reverse r/w */
1759 /* don't fill the pipe buf */
1760 check_pollclosed_immediate_readnone(readfd, writefd, POLLHUP);
1761 }
1762
1763 ATF_TC(pollclosed_ptyhost_delayed_process_write);
1764 ATF_TC_HEAD(pollclosed_ptyhost_delayed_process_write, tc)
1765 {
1766 atf_tc_set_md_var(tc, "descr",
1767 "Checks POLLHUP with closing the pty host side");
1768 }
1769 ATF_TC_BODY(pollclosed_ptyhost_delayed_process_write, tc)
1770 {
1771 int writefd, readfd;
1772
1773 pollclosed_ptyhost_setup(&writefd, &readfd);
1774 fillpipebuf(writefd);
1775 check_pollclosed_delayed_process(writefd, readfd,
1776 &check_pollclosed_delayed_write_terminal);
1777 }
1778
1779 ATF_TC(pollclosed_ptyhost_delayed_process_read);
1780 ATF_TC_HEAD(pollclosed_ptyhost_delayed_process_read, tc)
1781 {
1782 atf_tc_set_md_var(tc, "descr",
1783 "Checks POLLHUP with closing the pty host side");
1784 }
1785 ATF_TC_BODY(pollclosed_ptyhost_delayed_process_read, tc)
1786 {
1787 int writefd, readfd;
1788
1789 /*
1790 * poll(2) returns POLLHUP but not POLLIN even though read(2)
1791 * would return EOF without blocking.
1792 */
1793 atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
1794
1795 pollclosed_ptyapp_setup(&writefd, &readfd); /* reverse r/w */
1796 /* don't fill pipe buf */
1797 check_pollclosed_delayed_process(readfd, writefd,
1798 &check_pollclosed_delayed_read_devfifopipe);
1799 }
1800
1801 ATF_TC(pollclosed_ptyhost_delayed_thread_write);
1802 ATF_TC_HEAD(pollclosed_ptyhost_delayed_thread_write, tc)
1803 {
1804 atf_tc_set_md_var(tc, "descr",
1805 "Checks POLLHUP with closing the pty host side");
1806 }
1807 ATF_TC_BODY(pollclosed_ptyhost_delayed_thread_write, tc)
1808 {
1809 int writefd, readfd;
1810
1811 pollclosed_ptyhost_setup(&writefd, &readfd);
1812 fillpipebuf(writefd);
1813 check_pollclosed_delayed_thread(writefd, readfd,
1814 &check_pollclosed_delayed_write_terminal);
1815 }
1816
1817 ATF_TC(pollclosed_ptyhost_delayed_thread_read);
1818 ATF_TC_HEAD(pollclosed_ptyhost_delayed_thread_read, tc)
1819 {
1820 atf_tc_set_md_var(tc, "descr",
1821 "Checks POLLHUP with closing the pty host side");
1822 }
1823 ATF_TC_BODY(pollclosed_ptyhost_delayed_thread_read, tc)
1824 {
1825 int writefd, readfd;
1826
1827 /*
1828 * poll(2) returns POLLHUP but not POLLIN even though read(2)
1829 * would return EOF without blocking.
1830 */
1831 atf_tc_expect_fail("PR kern/59056: poll POLLHUP bugs");
1832
1833 pollclosed_ptyapp_setup(&writefd, &readfd); /* reverse r/w */
1834 /* don't fill pipe buf */
1835 check_pollclosed_delayed_thread(readfd, writefd,
1836 &check_pollclosed_delayed_read_devfifopipe);
1837 }
1838
1839 ATF_TC(pollclosed_socketpair0_immediate_writefull);
1840 ATF_TC_HEAD(pollclosed_socketpair0_immediate_writefull, tc)
1841 {
1842 atf_tc_set_md_var(tc, "descr",
1843 "Checks POLLHUP with closing the first half of a socketpair");
1844 }
1845 ATF_TC_BODY(pollclosed_socketpair0_immediate_writefull, tc)
1846 {
1847 int writefd, readfd;
1848
1849 pollclosed_socketpair0_setup(&writefd, &readfd);
1850 fillpipebuf(writefd);
1851 check_pollclosed_immediate_write(writefd, readfd, POLLOUT, EPIPE);
1852 }
1853
1854 ATF_TC(pollclosed_socketpair0_immediate_writeempty);
1855 ATF_TC_HEAD(pollclosed_socketpair0_immediate_writeempty, tc)
1856 {
1857 atf_tc_set_md_var(tc, "descr",
1858 "Checks POLLHUP with closing the first half of a socketpair");
1859 }
1860 ATF_TC_BODY(pollclosed_socketpair0_immediate_writeempty, tc)
1861 {
1862 int writefd, readfd;
1863
1864 pollclosed_socketpair0_setup(&writefd, &readfd);
1865 /* don't fill the pipe buf */
1866 check_pollclosed_immediate_write(writefd, readfd, POLLOUT, EPIPE);
1867 }
1868
1869 ATF_TC(pollclosed_socketpair0_immediate_readsome);
1870 ATF_TC_HEAD(pollclosed_socketpair0_immediate_readsome, tc)
1871 {
1872 atf_tc_set_md_var(tc, "descr",
1873 "Checks POLLHUP with closing the first half of a socketpair");
1874 }
1875 ATF_TC_BODY(pollclosed_socketpair0_immediate_readsome, tc)
1876 {
1877 int writefd, readfd;
1878
1879 pollclosed_socketpair1_setup(&writefd, &readfd); /* reverse r/w */
1880 fillpipebuf(writefd);
1881 check_pollclosed_immediate_readsome(readfd, writefd, /*no POLLHUP*/0);
1882 }
1883
1884 ATF_TC(pollclosed_socketpair0_immediate_readnone);
1885 ATF_TC_HEAD(pollclosed_socketpair0_immediate_readnone, tc)
1886 {
1887 atf_tc_set_md_var(tc, "descr",
1888 "Checks POLLHUP with closing the first half of a socketpair");
1889 }
1890 ATF_TC_BODY(pollclosed_socketpair0_immediate_readnone, tc)
1891 {
1892 int writefd, readfd;
1893
1894 pollclosed_socketpair1_setup(&writefd, &readfd); /* reverse r/w */
1895 /* don't fill the pipe buf */
1896 check_pollclosed_immediate_readnone(readfd, writefd, /*no POLLHUP*/0);
1897 }
1898
1899 ATF_TC(pollclosed_socketpair0_delayed_process_write);
1900 ATF_TC_HEAD(pollclosed_socketpair0_delayed_process_write, tc)
1901 {
1902 atf_tc_set_md_var(tc, "descr",
1903 "Checks POLLHUP with closing the first half of a socketpair");
1904 }
1905 ATF_TC_BODY(pollclosed_socketpair0_delayed_process_write, tc)
1906 {
1907 int writefd, readfd;
1908
1909 pollclosed_socketpair0_setup(&writefd, &readfd);
1910 fillpipebuf(writefd);
1911 check_pollclosed_delayed_process(writefd, readfd,
1912 &check_pollclosed_delayed_write_fifopipesocket);
1913 }
1914
1915 ATF_TC(pollclosed_socketpair0_delayed_process_read);
1916 ATF_TC_HEAD(pollclosed_socketpair0_delayed_process_read, tc)
1917 {
1918 atf_tc_set_md_var(tc, "descr",
1919 "Checks POLLHUP with closing the first half of a socketpair");
1920 }
1921 ATF_TC_BODY(pollclosed_socketpair0_delayed_process_read, tc)
1922 {
1923 int writefd, readfd;
1924
1925 pollclosed_socketpair1_setup(&writefd, &readfd); /* reverse r/w */
1926 /* don't fill pipe buf */
1927 check_pollclosed_delayed_process(readfd, writefd,
1928 &check_pollclosed_delayed_read_socket);
1929 }
1930
1931 ATF_TC(pollclosed_socketpair0_delayed_thread_write);
1932 ATF_TC_HEAD(pollclosed_socketpair0_delayed_thread_write, tc)
1933 {
1934 atf_tc_set_md_var(tc, "descr",
1935 "Checks POLLHUP with closing the first half of a socketpair");
1936 }
1937 ATF_TC_BODY(pollclosed_socketpair0_delayed_thread_write, tc)
1938 {
1939 int writefd, readfd;
1940
1941 pollclosed_socketpair0_setup(&writefd, &readfd);
1942 fillpipebuf(writefd);
1943 check_pollclosed_delayed_thread(writefd, readfd,
1944 &check_pollclosed_delayed_write_fifopipesocket);
1945 }
1946
1947 ATF_TC(pollclosed_socketpair0_delayed_thread_read);
1948 ATF_TC_HEAD(pollclosed_socketpair0_delayed_thread_read, tc)
1949 {
1950 atf_tc_set_md_var(tc, "descr",
1951 "Checks POLLHUP with closing the first half of a socketpair");
1952 }
1953 ATF_TC_BODY(pollclosed_socketpair0_delayed_thread_read, tc)
1954 {
1955 int writefd, readfd;
1956
1957 pollclosed_socketpair1_setup(&writefd, &readfd); /* reverse r/w */
1958 /* don't fill pipe buf */
1959 check_pollclosed_delayed_thread(readfd, writefd,
1960 &check_pollclosed_delayed_read_socket);
1961 }
1962
1963 ATF_TC(pollclosed_socketpair1_immediate_writefull);
1964 ATF_TC_HEAD(pollclosed_socketpair1_immediate_writefull, tc)
1965 {
1966 atf_tc_set_md_var(tc, "descr",
1967 "Checks POLLHUP with closing the second half of a socketpair");
1968 }
1969 ATF_TC_BODY(pollclosed_socketpair1_immediate_writefull, tc)
1970 {
1971 int writefd, readfd;
1972
1973 pollclosed_socketpair1_setup(&writefd, &readfd);
1974 fillpipebuf(writefd);
1975 check_pollclosed_immediate_write(writefd, readfd, POLLOUT, EPIPE);
1976 }
1977
1978 ATF_TC(pollclosed_socketpair1_immediate_writeempty);
1979 ATF_TC_HEAD(pollclosed_socketpair1_immediate_writeempty, tc)
1980 {
1981 atf_tc_set_md_var(tc, "descr",
1982 "Checks POLLHUP with closing the second half of a socketpair");
1983 }
1984 ATF_TC_BODY(pollclosed_socketpair1_immediate_writeempty, tc)
1985 {
1986 int writefd, readfd;
1987
1988 pollclosed_socketpair1_setup(&writefd, &readfd);
1989 /* don't fill the pipe buf */
1990 check_pollclosed_immediate_write(writefd, readfd, POLLOUT, EPIPE);
1991 }
1992
1993 ATF_TC(pollclosed_socketpair1_immediate_readsome);
1994 ATF_TC_HEAD(pollclosed_socketpair1_immediate_readsome, tc)
1995 {
1996 atf_tc_set_md_var(tc, "descr",
1997 "Checks POLLHUP with closing the second half of a socketpair");
1998 }
1999 ATF_TC_BODY(pollclosed_socketpair1_immediate_readsome, tc)
2000 {
2001 int writefd, readfd;
2002
2003 pollclosed_socketpair0_setup(&writefd, &readfd); /* reverse r/w */
2004 fillpipebuf(writefd);
2005 check_pollclosed_immediate_readsome(readfd, writefd, /*no POLLHUP*/0);
2006 }
2007
2008 ATF_TC(pollclosed_socketpair1_immediate_readnone);
2009 ATF_TC_HEAD(pollclosed_socketpair1_immediate_readnone, tc)
2010 {
2011 atf_tc_set_md_var(tc, "descr",
2012 "Checks POLLHUP with closing the second half of a socketpair");
2013 }
2014 ATF_TC_BODY(pollclosed_socketpair1_immediate_readnone, tc)
2015 {
2016 int writefd, readfd;
2017
2018 pollclosed_socketpair0_setup(&writefd, &readfd); /* reverse r/w */
2019 /* don't fill the pipe buf */
2020 check_pollclosed_immediate_readnone(readfd, writefd, /*no POLLHUP*/0);
2021 }
2022
2023 ATF_TC(pollclosed_socketpair1_delayed_process_write);
2024 ATF_TC_HEAD(pollclosed_socketpair1_delayed_process_write, tc)
2025 {
2026 atf_tc_set_md_var(tc, "descr",
2027 "Checks POLLHUP with closing the second half of a socketpair");
2028 }
2029 ATF_TC_BODY(pollclosed_socketpair1_delayed_process_write, tc)
2030 {
2031 int writefd, readfd;
2032
2033 pollclosed_socketpair1_setup(&writefd, &readfd);
2034 fillpipebuf(writefd);
2035 check_pollclosed_delayed_process(writefd, readfd,
2036 &check_pollclosed_delayed_write_fifopipesocket);
2037 }
2038
2039 ATF_TC(pollclosed_socketpair1_delayed_process_read);
2040 ATF_TC_HEAD(pollclosed_socketpair1_delayed_process_read, tc)
2041 {
2042 atf_tc_set_md_var(tc, "descr",
2043 "Checks POLLHUP with closing the second half of a socketpair");
2044 }
2045 ATF_TC_BODY(pollclosed_socketpair1_delayed_process_read, tc)
2046 {
2047 int writefd, readfd;
2048
2049 pollclosed_socketpair0_setup(&writefd, &readfd); /* reverse r/w */
2050 /* don't fill pipe buf */
2051 check_pollclosed_delayed_process(readfd, writefd,
2052 &check_pollclosed_delayed_read_socket);
2053 }
2054
2055 ATF_TC(pollclosed_socketpair1_delayed_thread_write);
2056 ATF_TC_HEAD(pollclosed_socketpair1_delayed_thread_write, tc)
2057 {
2058 atf_tc_set_md_var(tc, "descr",
2059 "Checks POLLHUP with closing the second half of a socketpair");
2060 }
2061 ATF_TC_BODY(pollclosed_socketpair1_delayed_thread_write, tc)
2062 {
2063 int writefd, readfd;
2064
2065 pollclosed_socketpair1_setup(&writefd, &readfd);
2066 fillpipebuf(writefd);
2067 check_pollclosed_delayed_thread(writefd, readfd,
2068 &check_pollclosed_delayed_write_fifopipesocket);
2069 }
2070
2071 ATF_TC(pollclosed_socketpair1_delayed_thread_read);
2072 ATF_TC_HEAD(pollclosed_socketpair1_delayed_thread_read, tc)
2073 {
2074 atf_tc_set_md_var(tc, "descr",
2075 "Checks POLLHUP with closing the second half of a socketpair");
2076 }
2077 ATF_TC_BODY(pollclosed_socketpair1_delayed_thread_read, tc)
2078 {
2079 int writefd, readfd;
2080
2081 pollclosed_socketpair0_setup(&writefd, &readfd); /* reverse r/w */
2082 /* don't fill pipe buf */
2083 check_pollclosed_delayed_process(readfd, writefd,
2084 &check_pollclosed_delayed_read_socket);
2085 }
2086
2087 ATF_TP_ADD_TCS(tp)
2088 {
2089
2090 ATF_TP_ADD_TC(tp, 3way);
2091 ATF_TP_ADD_TC(tp, basic);
2092 ATF_TP_ADD_TC(tp, err);
2093
2094 ATF_TP_ADD_TC(tp, fifo_inout);
2095 ATF_TP_ADD_TC(tp, fifo_hup1);
2096 ATF_TP_ADD_TC(tp, fifo_hup2);
2097
2098 ATF_TP_ADD_TC(tp, pollclosed_fifo0_immediate_writefull);
2099 ATF_TP_ADD_TC(tp, pollclosed_fifo1_immediate_writefull);
2100 ATF_TP_ADD_TC(tp, pollclosed_pipe_immediate_writefull);
2101 ATF_TP_ADD_TC(tp, pollclosed_ptyapp_immediate_writefull);
2102 ATF_TP_ADD_TC(tp, pollclosed_ptyhost_immediate_writefull);
2103 ATF_TP_ADD_TC(tp, pollclosed_socketpair0_immediate_writefull);
2104 ATF_TP_ADD_TC(tp, pollclosed_socketpair1_immediate_writefull);
2105
2106 ATF_TP_ADD_TC(tp, pollclosed_fifo0_immediate_writeempty);
2107 ATF_TP_ADD_TC(tp, pollclosed_fifo1_immediate_writeempty);
2108 ATF_TP_ADD_TC(tp, pollclosed_pipe_immediate_writeempty);
2109 ATF_TP_ADD_TC(tp, pollclosed_ptyapp_immediate_writeempty);
2110 ATF_TP_ADD_TC(tp, pollclosed_ptyhost_immediate_writeempty);
2111 ATF_TP_ADD_TC(tp, pollclosed_socketpair0_immediate_writeempty);
2112 ATF_TP_ADD_TC(tp, pollclosed_socketpair1_immediate_writeempty);
2113
2114 ATF_TP_ADD_TC(tp, pollclosed_fifo0_immediate_readsome);
2115 ATF_TP_ADD_TC(tp, pollclosed_fifo1_immediate_readsome);
2116 ATF_TP_ADD_TC(tp, pollclosed_pipe_immediate_readsome);
2117 ATF_TP_ADD_TC(tp, pollclosed_ptyapp_immediate_readsome);
2118 ATF_TP_ADD_TC(tp, pollclosed_ptyhost_immediate_readsome);
2119 ATF_TP_ADD_TC(tp, pollclosed_socketpair0_immediate_readsome);
2120 ATF_TP_ADD_TC(tp, pollclosed_socketpair1_immediate_readsome);
2121
2122 ATF_TP_ADD_TC(tp, pollclosed_fifo0_immediate_readnone);
2123 ATF_TP_ADD_TC(tp, pollclosed_fifo1_immediate_readnone);
2124 ATF_TP_ADD_TC(tp, pollclosed_pipe_immediate_readnone);
2125 ATF_TP_ADD_TC(tp, pollclosed_ptyapp_immediate_readnone);
2126 ATF_TP_ADD_TC(tp, pollclosed_ptyhost_immediate_readnone);
2127 ATF_TP_ADD_TC(tp, pollclosed_socketpair0_immediate_readnone);
2128 ATF_TP_ADD_TC(tp, pollclosed_socketpair1_immediate_readnone);
2129
2130 ATF_TP_ADD_TC(tp, pollclosed_fifo0_delayed_process_write);
2131 ATF_TP_ADD_TC(tp, pollclosed_fifo1_delayed_process_write);
2132 ATF_TP_ADD_TC(tp, pollclosed_pipe_delayed_process_write);
2133 ATF_TP_ADD_TC(tp, pollclosed_ptyapp_delayed_process_write);
2134 ATF_TP_ADD_TC(tp, pollclosed_ptyhost_delayed_process_write);
2135 ATF_TP_ADD_TC(tp, pollclosed_socketpair0_delayed_process_write);
2136 ATF_TP_ADD_TC(tp, pollclosed_socketpair1_delayed_process_write);
2137
2138 ATF_TP_ADD_TC(tp, pollclosed_fifo0_delayed_process_read);
2139 ATF_TP_ADD_TC(tp, pollclosed_fifo1_delayed_process_read);
2140 ATF_TP_ADD_TC(tp, pollclosed_pipe_delayed_process_read);
2141 ATF_TP_ADD_TC(tp, pollclosed_ptyapp_delayed_process_read);
2142 ATF_TP_ADD_TC(tp, pollclosed_ptyhost_delayed_process_read);
2143 ATF_TP_ADD_TC(tp, pollclosed_socketpair0_delayed_process_read);
2144 ATF_TP_ADD_TC(tp, pollclosed_socketpair1_delayed_process_read);
2145
2146 ATF_TP_ADD_TC(tp, pollclosed_fifo0_delayed_thread_write);
2147 ATF_TP_ADD_TC(tp, pollclosed_fifo1_delayed_thread_write);
2148 ATF_TP_ADD_TC(tp, pollclosed_pipe_delayed_thread_write);
2149 ATF_TP_ADD_TC(tp, pollclosed_ptyapp_delayed_thread_write);
2150 ATF_TP_ADD_TC(tp, pollclosed_ptyhost_delayed_thread_write);
2151 ATF_TP_ADD_TC(tp, pollclosed_socketpair0_delayed_thread_write);
2152 ATF_TP_ADD_TC(tp, pollclosed_socketpair1_delayed_thread_write);
2153
2154 ATF_TP_ADD_TC(tp, pollclosed_fifo0_delayed_thread_read);
2155 ATF_TP_ADD_TC(tp, pollclosed_fifo1_delayed_thread_read);
2156 ATF_TP_ADD_TC(tp, pollclosed_pipe_delayed_thread_read);
2157 ATF_TP_ADD_TC(tp, pollclosed_ptyapp_delayed_thread_read);
2158 ATF_TP_ADD_TC(tp, pollclosed_ptyhost_delayed_thread_read);
2159 ATF_TP_ADD_TC(tp, pollclosed_socketpair0_delayed_thread_read);
2160 ATF_TP_ADD_TC(tp, pollclosed_socketpair1_delayed_thread_read);
2161
2162 return atf_no_error();
2163 }
2164