]> granicus.if.org Git - curl/commitdiff
pop3: Fixed processing of more than one response when sent in same packet
authorSteve Holme <steve_holme@hotmail.com>
Fri, 20 Dec 2013 07:17:17 +0000 (07:17 +0000)
committerSteve Holme <steve_holme@hotmail.com>
Fri, 20 Dec 2013 07:20:49 +0000 (07:20 +0000)
Added a loop to pop3_statemach_act() in which Curl_pp_readresp() is
called until the cache is drained. Without this multiple responses
received in a single packet could result in a hang or delay.

lib/pop3.c

index 71873a7cce5b2b4f364380b1cdb7e563bdfdd9f1..093b77e93d0a1a57ea2197b1092f79105da97a31 100644 (file)
@@ -1376,12 +1376,15 @@ static CURLcode pop3_statemach_act(struct connectdata *conn)
   if(pp->sendleft)
     return Curl_pp_flushsend(pp);
 
-  /* Read the response from the server */
-  result = Curl_pp_readresp(sock, pp, &pop3code, &nread);
-  if(result)
-    return result;
+ do {
+    /* Read the response from the server */
+    result = Curl_pp_readresp(sock, pp, &pop3code, &nread);
+    if(result)
+      return result;
+
+    if(!pop3code)
+      break;
 
-  if(pop3code) {
     /* We have now received a full POP3 server response */
     switch(pop3c->state) {
     case POP3_SERVERGREET:
@@ -1471,7 +1474,7 @@ static CURLcode pop3_statemach_act(struct connectdata *conn)
       state(conn, POP3_STOP);
       break;
     }
-  }
+  } while(!result && pop3c->state != POP3_STOP && Curl_pp_moredata(pp));
 
   return result;
 }