Treat POLLHUP without POLLIN or POLLOUT as an exception in the poll
version of cm_get_ssflags, to correctly handle TCP connection errors
on OS X.
{
struct pollfd *pfd = find_pollfd(selstate, fd);
+ /*
+ * OS X sets POLLHUP without POLLOUT on connection error. Catch this as
+ * well as other error events such as POLLNVAL, but only if POLLIN and
+ * POLLOUT aren't set, as we can get POLLHUP along with POLLIN with TCP
+ * data still to be read.
+ */
+ if (pfd->revents != 0 && !(pfd->revents & (POLLIN | POLLOUT)))
+ return SSF_EXCEPTION;
+
return ((pfd->revents & POLLIN) ? SSF_READ : 0) |
((pfd->revents & POLLOUT) ? SSF_WRITE : 0) |
((pfd->revents & POLLERR) ? SSF_EXCEPTION : 0);