diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pop3.c | 41 | ||||
-rw-r--r-- | lib/pop3.h | 3 |
2 files changed, 37 insertions, 7 deletions
diff --git a/lib/pop3.c b/lib/pop3.c index a47717a71..5d06dfcb5 100644 --- a/lib/pop3.c +++ b/lib/pop3.c @@ -421,6 +421,16 @@ static CURLcode pop3_state_list_resp(struct connectdata *conn, return CURLE_RECV_ERROR; } + /* This 'OK' line ends with a CR LF pair which is the two first bytes of the + EOB string so count this is two matching bytes. This is necessary to make + the code detect the EOB if the only data than comes now is %2e CR LF like + when there is no body to return. */ + pop3c->eob = 2; + + /* But since this initial CR LF pair is not part of the actual body, we set + the strip counter here so that these bytes won't be delivered. */ + pop3c->strip = 2; + /* POP3 download */ Curl_setup_transfer(conn, FIRSTSOCKET, -1, FALSE, pop3->bytecountp, -1, NULL); /* no upload here */ @@ -1082,11 +1092,22 @@ CURLcode Curl_pop3_write(struct connectdata *conn, return CURLE_OK; } else if(prev && (prev >= pop3c->eob)) { - /* write out the body part that didn't match */ - result = Curl_client_write(conn, CLIENTWRITE_BODY, (char*)POP3_EOB, - prev); - if(result) - return result; + + /* strip can only be non-zero for the very first mismatch after CRLF and + then both prev and strip are equal and nothing will be output + below */ + while(prev && pop3c->strip) { + prev--; + pop3c->strip--; + } + + if(prev) { + /* write out the body part that didn't match */ + result = Curl_client_write(conn, CLIENTWRITE_BODY, (char*)POP3_EOB, + prev); + if(result) + return result; + } } } @@ -1094,7 +1115,15 @@ CURLcode Curl_pop3_write(struct connectdata *conn, /* while EOB is matching, don't output it! */ return CURLE_OK; - result = Curl_client_write(conn, CLIENTWRITE_BODY, str, nread); + while(nread && pop3c->strip) { + nread--; + pop3c->strip--; + str++; + } + + if(nread) { + result = Curl_client_write(conn, CLIENTWRITE_BODY, str, nread); + } return result; } diff --git a/lib/pop3.h b/lib/pop3.h index 15256738e..e9bbd9195 100644 --- a/lib/pop3.h +++ b/lib/pop3.h @@ -7,7 +7,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 2009, Daniel Stenberg, <daniel@haxx.se>, et al. + * Copyright (C) 2009 - 2011, Daniel Stenberg, <daniel@haxx.se>, et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -46,6 +46,7 @@ struct pop3_conn { char *mailbox; /* what to RETR */ size_t eob; /* number of bytes of the EOB (End Of Body) that has been received thus far */ + size_t strip; /* number of bytes from the start to ignore as non-body */ pop3state state; /* always use pop3.c:state() to change state! */ }; |