diff options
author | Jiri Hruska <jirka@fud.cz> | 2013-02-27 19:49:00 +0100 |
---|---|---|
committer | Steve Holme <steve_holme@hotmail.com> | 2013-02-27 20:08:04 +0000 |
commit | c368fbcb1031198d36d964c649eb7730ee2a5844 (patch) | |
tree | ea076806571dbeae735f12466d7917652acc960e /lib | |
parent | b644c47192fb4c16297149544c5a647d916f7b10 (diff) |
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.
Diffstat (limited to 'lib')
-rw-r--r-- | lib/imap.c | 21 |
1 files changed, 12 insertions, 9 deletions
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; } |