From: Nathaniel McCallum Date: Fri, 30 Sep 2016 14:03:33 +0000 (-0400) Subject: Properly handle EOF condition on libkrad sockets X-Git-Tag: krb5-1.15-beta1~18 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F547%2Fhead;p=thirdparty%2Fkrb5.git Properly handle EOF condition on libkrad sockets In the previous code, when the remote peer performed an orderly shutdown on the socket, libkrad would enter a state in which all future requests timed out. Instead, if the peer shuts down its socket, we need to attempt to reopen it. ticket: 8504 (new) target_version: 1.14-next tags: pullup --- diff --git a/src/lib/krad/remote.c b/src/lib/krad/remote.c index f6abc43c26..437f7e91ac 100644 --- a/src/lib/krad/remote.c +++ b/src/lib/krad/remote.c @@ -329,16 +329,15 @@ on_io_read(krad_remote *rr) /* Read the packet. */ i = recv(verto_get_fd(rr->io), rr->buffer.data + rr->buffer.length, pktlen, 0); - if (i < 0) { - /* Should we try again? */ - if (errno == EWOULDBLOCK || errno == EAGAIN || errno == EINTR) - return; - /* The socket is unrecoverable. */ + /* On these errors, try again. */ + if (i < 0 && (errno == EWOULDBLOCK || errno == EAGAIN || errno == EINTR)) + return; + + /* On any other errors or on EOF, the socket is unrecoverable. */ + if (i <= 0) { remote_shutdown(rr); return; - } else if (i == 0) { - remote_del_flags(rr, FLAGS_READ); } /* If we have a partial read or just the header, try again. */