Bug #510320 --- a/saslauthd/auth_rimap.c +++ b/saslauthd/auth_rimap.c @@ -371,7 +371,7 @@ if ( rc>0 ) { /* check if there is more to read */ fd_set perm; - int fds, ret; + int fds, ret, loopc; struct timeval timeout; FD_ZERO(&perm); @@ -380,6 +380,7 @@ timeout.tv_sec = 1; timeout.tv_usec = 0; + loopc = 0; while( select (fds, &perm, NULL, NULL, &timeout ) >0 ) { if ( FD_ISSET(s, &perm) ) { ret = read(s, rbuf+rc, sizeof(rbuf)-rc); @@ -387,6 +388,14 @@ rc = ret; break; } else { + if (ret == 0) { + loopc += 1; + } else { + loopc = 0; + } + if (loopc > sizeof(rbuf)) { // arbitrary chosen value + break; + } rc += ret; } } @@ -484,7 +493,7 @@ if ( rc>0 ) { /* check if there is more to read */ fd_set perm; - int fds, ret; + int fds, ret, loopc; struct timeval timeout; FD_ZERO(&perm); @@ -493,6 +502,7 @@ timeout.tv_sec = 1; timeout.tv_usec = 0; + loopc = 0; while( select (fds, &perm, NULL, NULL, &timeout ) >0 ) { if ( FD_ISSET(s, &perm) ) { ret = read(s, rbuf+rc, sizeof(rbuf)-rc); @@ -500,6 +510,14 @@ rc = ret; break; } else { + if (ret == 0) { + loopc += 1; + } else { + loopc = 0; + } + if (loopc > sizeof(rbuf)) { // arbitrary chosen value + break; + } rc += ret; } } --- a/lib/checkpw.c +++ b/lib/checkpw.c @@ -587,16 +587,14 @@ /* Timeout. */ errno = ETIMEDOUT; return -1; - case +1: - if (FD_ISSET(fd, &rfds)) { - /* Success, file descriptor is readable. */ - return 0; - } - return -1; case -1: if (errno == EINTR || errno == EAGAIN) continue; default: + if (FD_ISSET(fd, &rfds)) { + /* Success, file descriptor is readable. */ + return 0; + } /* Error catch-all. */ return -1; }