aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNathaniel McCallum <npmccallum@redhat.com>2016-09-30 10:03:33 -0400
committerTom Yu <tlyu@mit.edu>2016-10-24 15:38:13 -0400
commit10d20626a327213f05578d7dffb4d02ddfce5b0f (patch)
treeadc35b23ffb99983724403e02fff64719dfe6201
parent2a50d753105df25076ace0a319fe321670655e2c (diff)
downloadkrb5-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.c13
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. */