aboutsummaryrefslogtreecommitdiff
path: root/lib/imap.c
diff options
context:
space:
mode:
authorJiri Hruska <jirka@fud.cz>2013-02-27 19:49:00 +0100
committerSteve Holme <steve_holme@hotmail.com>2013-02-27 20:08:04 +0000
commitc368fbcb1031198d36d964c649eb7730ee2a5844 (patch)
treeea076806571dbeae735f12466d7917652acc960e /lib/imap.c
parentb644c47192fb4c16297149544c5a647d916f7b10 (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/imap.c')
-rw-r--r--lib/imap.c21
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;
}