diff options
author | Pavel Březina <pbrezina@redhat.com> | 2012-10-04 11:42:59 +0200 |
---|---|---|
committer | Jakub Hrozek <jhrozek@redhat.com> | 2012-10-10 15:26:36 +0200 |
commit | adcb6802e4f6369b48a74c408fd53c4325576071 (patch) | |
tree | fafc974f3db6d97f648e9c3aa6fc3e56fb1e2701 /src/sss_client/common.c | |
parent | ae526063fcbc4b4c440e35e01e4eca35358c2906 (diff) | |
download | sssd-adcb6802e4f6369b48a74c408fd53c4325576071.tar.gz sssd-adcb6802e4f6369b48a74c408fd53c4325576071.tar.bz2 sssd-adcb6802e4f6369b48a74c408fd53c4325576071.zip |
do not fail if POLLHUP occurs while reading data
This cause troubles when we send data to a pipe and close the
file descriptor before data is read. The pipe is still readable,
but POLLHUP is detected and we fail to read them.
For example, this may cause a user beeing unable to log in.
Now if POLLHUP appears, we read the pipe and then close it on
the client side too.
Diffstat (limited to 'src/sss_client/common.c')
-rw-r--r-- | src/sss_client/common.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/src/sss_client/common.c b/src/sss_client/common.c index 5b175159..1ef3ba15 100644 --- a/src/sss_client/common.c +++ b/src/sss_client/common.c @@ -195,6 +195,7 @@ static enum sss_status sss_cli_recv_rep(enum sss_cli_command cmd, uint32_t header[4]; size_t datarecv; uint8_t *buf = NULL; + bool pollhup = false; int len; int ret; @@ -235,7 +236,10 @@ static enum sss_status sss_cli_recv_rep(enum sss_cli_command cmd, *errnop = ETIME; break; case 1: - if (pfd.revents & (POLLERR | POLLHUP | POLLNVAL)) { + if (pfd.revents & (POLLHUP)) { + pollhup = true; + } + if (pfd.revents & (POLLERR | POLLNVAL)) { *errnop = EPIPE; } if (!(pfd.revents & POLLIN)) { @@ -322,6 +326,10 @@ static enum sss_status sss_cli_recv_rep(enum sss_cli_command cmd, } } + if (pollhup) { + sss_cli_close_socket(); + } + *_len = len; *_buf = buf; |