You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gentoo-overlay/dev-libs/cyrus-sasl/files/cyrus-sasl-2.1.26-fix_dovec...

91 lines
2.4 KiB

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;
}