summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimo Sorce <ssorce@redhat.com>2011-05-03 12:15:07 -0400
committerStephen Gallagher <sgallagh@redhat.com>2011-05-03 13:08:22 -0400
commit809bc32d75cb6e17b1cba8a9e11f20c4aa8ecc48 (patch)
tree05dd37724c4093ceaca80d19d17d41f89db7bd23
parent7c4392c598f4ce426ee9e3fb9c8786677f55a33d (diff)
downloadsssd-809bc32d75cb6e17b1cba8a9e11f20c4aa8ecc48.tar.gz
sssd-809bc32d75cb6e17b1cba8a9e11f20c4aa8ecc48.tar.xz
sssd-809bc32d75cb6e17b1cba8a9e11f20c4aa8ecc48.zip
clients: use poll instead of selectsssd-1.5.1-34.el5
select is limited to fd numbers up to 1024, we need to use poll() here to avoid causing memory corruption in the calling process. Fixes: https://fedorahosted.org/sssd/ticket/861
-rw-r--r--src/sss_client/common.c15
1 files changed, 6 insertions, 9 deletions
diff --git a/src/sss_client/common.c b/src/sss_client/common.c
index d4b230889..c17629a9f 100644
--- a/src/sss_client/common.c
+++ b/src/sss_client/common.c
@@ -501,6 +501,7 @@ static int sss_nss_open_socket(int *errnop, const char *socket_name)
bool connected = false;
unsigned int wait_time;
unsigned int sleep_time;
+ time_t start_time = time(NULL);
int ret;
int sd;
@@ -529,8 +530,7 @@ static int sss_nss_open_socket(int *errnop, const char *socket_name)
while (inprogress) {
int connect_errno = 0;
socklen_t errnosize;
- struct timeval tv;
- fd_set w_fds;
+ struct pollfd pfd;
wait_time += sleep_time;
@@ -543,12 +543,10 @@ static int sss_nss_open_socket(int *errnop, const char *socket_name)
switch(errno) {
case EINPROGRESS:
- FD_ZERO(&w_fds);
- FD_SET(sd, &w_fds);
- tv.tv_sec = SSS_CLI_SOCKET_TIMEOUT - wait_time;
- tv.tv_usec = 0;
+ pfd.fd = sd;
+ pfd.events = POLLOUT;
- ret = select(sd + 1, NULL, &w_fds, NULL, &tv);
+ ret = poll(&pfd, 1, SSS_CLI_SOCKET_TIMEOUT - wait_time);
if (ret > 0) {
errnosize = sizeof(connect_errno);
@@ -559,8 +557,7 @@ static int sss_nss_open_socket(int *errnop, const char *socket_name)
break;
}
}
- wait_time += tv.tv_sec;
- if (tv.tv_usec != 0) wait_time++;
+ wait_time = time(NULL) - start_time;
break;
case EAGAIN:
if (wait_time < SSS_CLI_SOCKET_TIMEOUT) {