From: Jiri Hruska Date: Wed, 27 Feb 2013 18:49:00 +0000 (+0100) Subject: imap: Added processing of more than one response when sent in same packet X-Git-Tag: curl-7_30_0~246 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c368fbcb1031198d36d964c649eb7730ee2a5844;p=thirdparty%2Fcurl.git imap: Added processing of more than one response when sent in same packet Added a loop to imap_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. --- diff --git a/lib/imap.c b/lib/imap.c index 247d377797..37fbc453f9 100644 --- a/lib/imap.c +++ b/lib/imap.c @@ -1351,16 +1351,19 @@ static CURLcode imap_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, &imapcode, &nread); - if(result) - return result; + do { + /* Read the response from the server */ + result = Curl_pp_readresp(sock, pp, &imapcode, &nread); + if(result) + return result; - /* Was there an error parsing the response line? */ - if(imapcode == -1) - return CURLE_FTP_WEIRD_SERVER_REPLY; + /* Was there an error parsing the response line? */ + if(imapcode == -1) + return CURLE_FTP_WEIRD_SERVER_REPLY; + + if(!imapcode) + break; - if(imapcode) { /* We have now received a full IMAP server response */ switch(imapc->state) { case IMAP_SERVERGREET: @@ -1436,7 +1439,7 @@ static CURLcode imap_statemach_act(struct connectdata *conn) state(conn, IMAP_STOP); break; } - } + } while(!result && imapc->state != IMAP_STOP && Curl_pp_moredata(pp)); return result; }