1*2c2f96dcSApple OSS Distributions #include <darwintest.h> 2*2c2f96dcSApple OSS Distributions #include <poll.h> 3*2c2f96dcSApple OSS Distributions #include <sys/socket.h> 4*2c2f96dcSApple OSS Distributions #include <unistd.h> 5*2c2f96dcSApple OSS Distributions 6*2c2f96dcSApple OSS Distributions T_GLOBAL_META(T_META_RUN_CONCURRENTLY(true)); 7*2c2f96dcSApple OSS Distributions 8*2c2f96dcSApple OSS Distributions T_DECL(socket_poll_close_25786011, "Tests an invalid poll call to a socket and then calling close.", T_META_LTEPHASE(LTE_POSTINIT)) 9*2c2f96dcSApple OSS Distributions { 10*2c2f96dcSApple OSS Distributions int my_socket, ret; 11*2c2f96dcSApple OSS Distributions 12*2c2f96dcSApple OSS Distributions my_socket = socket(PF_LOCAL, SOCK_STREAM, 0); 13*2c2f96dcSApple OSS Distributions T_WITH_ERRNO; T_ASSERT_TRUE(my_socket > 0, "create socket"); 14*2c2f96dcSApple OSS Distributions 15*2c2f96dcSApple OSS Distributions /* 16*2c2f96dcSApple OSS Distributions * Setup a pollfd that we know will return an error when we try 17*2c2f96dcSApple OSS Distributions * to create a knote for it. We specify a BSD vnode specific event 18*2c2f96dcSApple OSS Distributions * for a socket. 19*2c2f96dcSApple OSS Distributions */ 20*2c2f96dcSApple OSS Distributions struct pollfd my_pollfd = { 21*2c2f96dcSApple OSS Distributions .fd = my_socket, 22*2c2f96dcSApple OSS Distributions .events = POLLEXTEND 23*2c2f96dcSApple OSS Distributions }; 24*2c2f96dcSApple OSS Distributions 25*2c2f96dcSApple OSS Distributions /* 26*2c2f96dcSApple OSS Distributions * Previously the call to kevent_register() in the kernel from this call 27*2c2f96dcSApple OSS Distributions * would leak an iocount reference on the fileproc, which would cause any 28*2c2f96dcSApple OSS Distributions * subsequent calls to close() on the associated fd to block indefinitely. 29*2c2f96dcSApple OSS Distributions */ 30*2c2f96dcSApple OSS Distributions ret = poll(&my_pollfd, 1, 0); 31*2c2f96dcSApple OSS Distributions T_WITH_ERRNO; T_ASSERT_TRUE(ret == 1, "poll returned %d", ret); 32*2c2f96dcSApple OSS Distributions 33*2c2f96dcSApple OSS Distributions ret = close(my_socket); 34*2c2f96dcSApple OSS Distributions T_ASSERT_POSIX_ZERO(ret, "close on socket with fd %d\n", my_socket); 35*2c2f96dcSApple OSS Distributions 36*2c2f96dcSApple OSS Distributions T_PASS("socket_poll_close_25786011 PASSED"); 37*2c2f96dcSApple OSS Distributions } 38