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