summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/pop3.c41
-rw-r--r--lib/pop3.h3
-rw-r--r--tests/data/DISABLED1
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, <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! */
};
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