aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSteve Holme <steve_holme@hotmail.com>2012-02-17 18:24:52 +0000
committerDaniel Stenberg <daniel@haxx.se>2012-02-17 22:47:19 +0100
commit3d98aed5b351b6437a6ffffed0589f8ab02a59e0 (patch)
treecb29388451e8c1350d3e1c47b8d3d12c51e2b45d
parent4cf742f34f77e4cc3b5418371357bb38a1e03cce (diff)
smtp.c: Fixed an issue with the EOB checking
Curl_smtp_escape_eob() would leave off final CRLFs from emails ending in multiple blank lines additionally leaving the smtpc->eob variable with the character count in, which would cause problems for additional emails when sent through multiple calls to curl_easy_perform() after a CURLOPT_CONNECT_ONLY.
-rw-r--r--lib/smtp.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/lib/smtp.c b/lib/smtp.c
index 90afa8a6d..3ee068692 100644
--- a/lib/smtp.c
+++ b/lib/smtp.c
@@ -1679,11 +1679,14 @@ CURLcode Curl_smtp_escape_eob(struct connectdata *conn, ssize_t nread)
struct smtp_conn *smtpc = &conn->proto.smtpc;
struct SessionHandle *data = conn->data;
- if(data->state.scratch == NULL)
+ /* Do we need to allocate the scatch buffer? */
+ if(!data->state.scratch) {
data->state.scratch = malloc(2 * BUFSIZE);
- if(data->state.scratch == NULL) {
- failf (data, "Failed to alloc scratch buffer!");
- return CURLE_OUT_OF_MEMORY;
+
+ if(!data->state.scratch) {
+ failf (data, "Failed to alloc scratch buffer!");
+ return CURLE_OUT_OF_MEMORY;
+ }
}
/* This loop can be improved by some kind of Boyer-Moore style of
@@ -1692,7 +1695,7 @@ CURLcode Curl_smtp_escape_eob(struct connectdata *conn, ssize_t nread)
if(SMTP_EOB[smtpc->eob] == data->req.upload_fromhere[i])
smtpc->eob++;
else if(smtpc->eob) {
- /* previously a substring matched, output that first */
+ /* A previous substring matched so output that first */
memcpy(&data->state.scratch[si], SMTP_EOB, smtpc->eob);
si += smtpc->eob;
@@ -1718,6 +1721,13 @@ CURLcode Curl_smtp_escape_eob(struct connectdata *conn, ssize_t nread)
data->state.scratch[si++] = data->req.upload_fromhere[i];
}
+ if(smtpc->eob) {
+ /* A substring matched before processing ended so output that now */
+ memcpy(&data->state.scratch[si], SMTP_EOB, smtpc->eob);
+ si += smtpc->eob;
+ smtpc->eob = 0;
+ }
+
if(si != nread) {
/* only use the new buffer if we replaced something */
nread = si;