summaryrefslogtreecommitdiff
path: root/lib/smtp.c
diff options
context:
space:
mode:
authorSteve Holme <steve_holme@hotmail.com>2014-11-26 22:44:28 +0000
committerSteve Holme <steve_holme@hotmail.com>2014-11-26 23:31:54 +0000
commit4bd860a001921e1e007ae448cfdd2c983018c057 (patch)
tree3d9c73afc863d99c26c69e8ee83dfdee5ada851f /lib/smtp.c
parentaa3e8dd3da62537af1546dc41aaf9042985f8b7a (diff)
downloadcurl-4bd860a001921e1e007ae448cfdd2c983018c057.tar.gz
smtp: Added support for the conversion of Unix newlines during mail send
Added support for the automatic conversion of Unix newlines to CRLF during mail uploads. Feature: http://curl.haxx.se/bug/view.cgi?id=1456
Diffstat (limited to 'lib/smtp.c')
-rw-r--r--lib/smtp.c30
1 files changed, 21 insertions, 9 deletions
diff --git a/lib/smtp.c b/lib/smtp.c
index 5f6524357..2dbd2ea30 100644
--- a/lib/smtp.c
+++ b/lib/smtp.c
@@ -2320,13 +2320,17 @@ CURLcode Curl_smtp_escape_eob(struct connectdata *conn, ssize_t nread)
ssize_t si;
struct SessionHandle *data = conn->data;
struct SMTP *smtp = data->req.protop;
+ char *scratch = data->state.scratch;
+ char *oldscratch = NULL;
/* Do we need to allocate the scatch buffer? */
- if(!data->state.scratch) {
- data->state.scratch = malloc(2 * BUFSIZE);
+ if(!scratch || data->set.crlf) {
+ oldscratch = scratch;
+
+ scratch = malloc(2 * BUFSIZE);
+ if(!scratch) {
+ failf(data, "Failed to alloc scratch buffer!");
- if(!data->state.scratch) {
- failf (data, "Failed to alloc scratch buffer!");
return CURLE_OUT_OF_MEMORY;
}
}
@@ -2345,7 +2349,7 @@ CURLcode Curl_smtp_escape_eob(struct connectdata *conn, ssize_t nread)
}
else if(smtp->eob) {
/* A previous substring matched so output that first */
- memcpy(&data->state.scratch[si], SMTP_EOB, smtp->eob);
+ memcpy(&scratch[si], SMTP_EOB, smtp->eob);
si += smtp->eob;
/* Then compare the first byte */
@@ -2361,17 +2365,17 @@ CURLcode Curl_smtp_escape_eob(struct connectdata *conn, ssize_t nread)
/* Do we have a match for CRLF. as per RFC-5321, sect. 4.5.2 */
if(SMTP_EOB_FIND_LEN == smtp->eob) {
/* Copy the replacement data to the target buffer */
- memcpy(&data->state.scratch[si], SMTP_EOB_REPL, SMTP_EOB_REPL_LEN);
+ memcpy(&scratch[si], SMTP_EOB_REPL, SMTP_EOB_REPL_LEN);
si += SMTP_EOB_REPL_LEN;
smtp->eob = 0;
}
else if(!smtp->eob)
- data->state.scratch[si++] = data->req.upload_fromhere[i];
+ scratch[si++] = data->req.upload_fromhere[i];
}
if(smtp->eob) {
/* A substring matched before processing ended so output that now */
- memcpy(&data->state.scratch[si], SMTP_EOB, smtp->eob);
+ memcpy(&scratch[si], SMTP_EOB, smtp->eob);
si += smtp->eob;
smtp->eob = 0;
}
@@ -2381,11 +2385,19 @@ CURLcode Curl_smtp_escape_eob(struct connectdata *conn, ssize_t nread)
nread = si;
/* Upload from the new (replaced) buffer instead */
- data->req.upload_fromhere = data->state.scratch;
+ data->req.upload_fromhere = scratch;
+
+ /* Save the buffer so it can be freed later */
+ data->state.scratch = scratch;
+
+ /* Free the old scratch buffer */
+ Curl_safefree(oldscratch);
/* Set the new amount too */
data->req.upload_present = nread;
}
+ else
+ Curl_safefree(scratch);
return CURLE_OK;
}