summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPavel Březina <pbrezina@redhat.com>2012-10-04 11:42:59 +0200
committerJakub Hrozek <jhrozek@redhat.com>2012-10-10 15:26:36 +0200
commitadcb6802e4f6369b48a74c408fd53c4325576071 (patch)
treefafc974f3db6d97f648e9c3aa6fc3e56fb1e2701
parentae526063fcbc4b4c440e35e01e4eca35358c2906 (diff)
downloadsssd-adcb6802e4f6369b48a74c408fd53c4325576071.tar.gz
sssd-adcb6802e4f6369b48a74c408fd53c4325576071.tar.xz
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.
-rw-r--r--src/sss_client/common.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/src/sss_client/common.c b/src/sss_client/common.c
index 5b1751593..1ef3ba15e 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;