diff options
author | Simo Sorce <ssorce@redhat.com> | 2011-05-03 12:15:07 -0400 |
---|---|---|
committer | Stephen Gallagher <sgallagh@redhat.com> | 2011-05-03 13:08:22 -0400 |
commit | 809bc32d75cb6e17b1cba8a9e11f20c4aa8ecc48 (patch) | |
tree | 05dd37724c4093ceaca80d19d17d41f89db7bd23 /src/sss_client/common.c | |
parent | 7c4392c598f4ce426ee9e3fb9c8786677f55a33d (diff) | |
download | sssd-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
Diffstat (limited to 'src/sss_client/common.c')
-rw-r--r-- | src/sss_client/common.c | 15 |
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) { |