From: Greg Hudson Date: Fri, 4 Apr 2014 18:58:33 +0000 (-0400) Subject: Fix sendto_kdc.c on OS X after cm refactoring X-Git-Tag: krb5-1.13-alpha1~159 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=82aa5f56acee4d63800a1a69794a2d7bc4f104fc;p=thirdparty%2Fkrb5.git Fix sendto_kdc.c on OS X after cm refactoring 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. --- diff --git a/src/lib/krb5/os/sendto_kdc.c b/src/lib/krb5/os/sendto_kdc.c index e773a0ad90..67e2a600c9 100644 --- a/src/lib/krb5/os/sendto_kdc.c +++ b/src/lib/krb5/os/sendto_kdc.c @@ -179,6 +179,15 @@ cm_get_ssflags(struct select_state *selstate, int fd) { 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);