The following reply was made to PR kern/162379; it has been noted by GNATS.
From: Gleb Smirnoff <gleb...@freebsd.org> To: Yui NARUSE <nar...@airemix.jp> Cc: freebsd-gnats-sub...@freebsd.org Subject: Re: kern/162379: When select(2) closed writing pipe, it will sticks. Date: Thu, 10 Nov 2011 16:27:37 +0400 On Tue, Nov 08, 2011 at 04:57:50PM +0000, Yui NARUSE wrote: Y> >How-To-Repeat: Y> Run following program, it will sticks. Y> Y> #include <stdio.h> Y> #include <stdlib.h> Y> #include <errno.h> Y> #include <sys/select.h> Y> #define max(x,y) ((x > y) ? x : y) Y> int Y> main(void) { Y> int pipes[2]; Y> int res = pipe(pipes); Y> if (res != 0) abort(); Y> int r = pipes[0]; Y> int w = pipes[1]; Y> res = close(w); Y> if (res != 0) abort(); Y> fd_set readfds; FD_ZERO(&readfds); Y> fd_set writefds; FD_ZERO(&writefds); Y> fd_set exceptfds; FD_ZERO(&exceptfds); Y> FD_SET(w, &writefds); Y> res = select(max(r,w)+1, &readfds, &writefds, &exceptfds, NULL); Y> if (res) perror("select"); Y> return 0; Y> } Y> >Fix: According to SUS, issuing close() on a descriptor means deallocating it, and the argument value for close() is not a valid descriptor anymore after close(). http://pubs.opengroup.org/onlinepubs/9699919799/functions/close.html So, you are passing an invalid descriptor to FD_SET(). Behavior in this case is undefined. Quoting SUS: "The behavior of these macros is undefined if the fd argument is less than 0 or greater than or equal to FD_SETSIZE, or if fd is not a valid file descriptor, or if any of the arguments are expressions with side-effects." also "The pselect() and select() functions shall support regular files, terminal and pseudo-terminal devices, STREAMS-based files, FIFOs, pipes, and sockets. The behavior of pselect() and select() on file descriptors that refer to other types of file is unspecified." More info here: http://pubs.opengroup.org/onlinepubs/9699919799/functions/select.html If you don't mind, I am going to close this problem report. -- Totus tuus, Glebius. _______________________________________________ freebsd-bugs@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/freebsd-bugs To unsubscribe, send any mail to "freebsd-bugs-unsubscr...@freebsd.org"