]> granicus.if.org Git - curl/commitdiff
smtp: Fixed processing of more than one response when sent in same packet
authorSteve Holme <steve_holme@hotmail.com>
Fri, 15 Nov 2013 10:54:47 +0000 (10:54 +0000)
committerSteve Holme <steve_holme@hotmail.com>
Fri, 15 Nov 2013 10:54:23 +0000 (10:54 +0000)
Added a loop to smtp_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/smtp.c

index 77d36e90950b644eb04c77204ee18eaee0bf9400..456ab09eab4b4cca04a5f5179b1296d7fa79f286 100644 (file)
@@ -1352,16 +1352,19 @@ static CURLcode smtp_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, &smtpcode, &nread);
-  if(result)
-    return result;
+  do {
+    /* Read the response from the server */
+    result = Curl_pp_readresp(sock, pp, &smtpcode, &nread);
+    if(result)
+      return result;
 
-  /* Store the latest response for later retrieval */
-  if(smtpc->state != SMTP_QUIT && smtpcode != 1)
-    data->info.httpcode = smtpcode;
+    /* Store the latest response for later retrieval if necessary */
+    if(smtpc->state != SMTP_QUIT && smtpcode != 1)
+      data->info.httpcode = smtpcode;
+
+    if(!smtpcode)
+      break;
 
-  if(smtpcode) {
     /* We have now received a full SMTP server response */
     switch(smtpc->state) {
     case SMTP_SERVERGREET:
@@ -1453,7 +1456,7 @@ static CURLcode smtp_statemach_act(struct connectdata *conn)
       state(conn, SMTP_STOP);
       break;
     }
-  }
+  } while(!result && smtpc->state != SMTP_STOP && Curl_pp_moredata(pp));
 
   return result;
 }