diff options
author | Steve Holme <steve_holme@hotmail.com> | 2012-02-17 18:24:52 +0000 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2012-02-17 22:47:19 +0100 |
commit | 3d98aed5b351b6437a6ffffed0589f8ab02a59e0 (patch) | |
tree | cb29388451e8c1350d3e1c47b8d3d12c51e2b45d | |
parent | 4cf742f34f77e4cc3b5418371357bb38a1e03cce (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.c | 20 |
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; |