diff options
author | Nathaniel McCallum <npmccallum@redhat.com> | 2016-09-30 10:03:33 -0400 |
---|---|---|
committer | Tom Yu <tlyu@mit.edu> | 2016-10-24 15:38:13 -0400 |
commit | 10d20626a327213f05578d7dffb4d02ddfce5b0f (patch) | |
tree | adc35b23ffb99983724403e02fff64719dfe6201 | |
parent | 2a50d753105df25076ace0a319fe321670655e2c (diff) | |
download | krb5-10d20626a327213f05578d7dffb4d02ddfce5b0f.zip krb5-10d20626a327213f05578d7dffb4d02ddfce5b0f.tar.gz krb5-10d20626a327213f05578d7dffb4d02ddfce5b0f.tar.bz2 |
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.
(cherry picked from commit 248497427d5a45225817b6c22e9224e8ad969872)
ticket: 8504
version_fixed: 1.14.5
-rw-r--r-- | src/lib/krad/remote.c | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/src/lib/krad/remote.c b/src/lib/krad/remote.c index df3de3a..68cd16f 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. */ |