summaryrefslogtreecommitdiff
path: root/dev-libs/cyrus-sasl/files/cyrus-sasl-2.1.26-fix_dovecot_authentication.patch
blob: 6fc9de80287e3e23cb2b220f523b91f313330d71 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
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;
 	}