From c368fbcb1031198d36d964c649eb7730ee2a5844 Mon Sep 17 00:00:00 2001 From: Jiri Hruska Date: Wed, 27 Feb 2013 19:49:00 +0100 Subject: 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. --- lib/imap.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) (limited to 'lib/imap.c') diff --git a/lib/imap.c b/lib/imap.c index 247d37779..37fbc453f 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; } -- cgit v1.2.3