diff options
author | Steve Holme <steve_holme@hotmail.com> | 2014-11-26 22:44:28 +0000 |
---|---|---|
committer | Steve Holme <steve_holme@hotmail.com> | 2014-11-26 23:31:54 +0000 |
commit | 4bd860a001921e1e007ae448cfdd2c983018c057 (patch) | |
tree | 3d9c73afc863d99c26c69e8ee83dfdee5ada851f /lib/smtp.c | |
parent | aa3e8dd3da62537af1546dc41aaf9042985f8b7a (diff) | |
download | curl-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.c | 30 |
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; } |