From af6466643416fd36fea4205d2d7a02a9292e2858 Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Tue, 29 Nov 2011 13:43:46 +0100 Subject: POP3: detect when LIST returns no mails By making sure the function can detect an "end of body" sequence immediately on the first line, test 811 is now enabled. --- lib/pop3.c | 41 +++++++++++++++++++++++++++++++++++------ lib/pop3.h | 3 ++- tests/data/DISABLED | 1 - 3 files changed, 37 insertions(+), 8 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, , et al. + * Copyright (C) 2009 - 2011, Daniel Stenberg, , 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! */ }; diff --git a/tests/data/DISABLED b/tests/data/DISABLED index 085a3a387..72c3909bd 100644 --- a/tests/data/DISABLED +++ b/tests/data/DISABLED @@ -2,7 +2,6 @@ # test cases are run by runtests.pl. Just add the plain test case numbers, one # per line. # Lines starting with '#' letters are treated as comments. -811 815 591 592 -- cgit v1.2.3