mirror of
https://github.com/moparisthebest/curl
synced 2024-12-21 15:48:49 -05:00
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
This commit is contained in:
parent
aa3e8dd3da
commit
4bd860a001
30
lib/smtp.c
30
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;
|
||||
}
|
||||
|
@ -903,15 +903,6 @@ static CURLcode readwrite_upload(struct SessionHandle *data,
|
||||
/* store number of bytes available for upload */
|
||||
data->req.upload_present = nread;
|
||||
|
||||
#ifndef CURL_DISABLE_SMTP
|
||||
if(conn->handler->protocol & PROTO_FAMILY_SMTP) {
|
||||
result = Curl_smtp_escape_eob(conn, nread);
|
||||
if(result)
|
||||
return result;
|
||||
}
|
||||
else
|
||||
#endif /* CURL_DISABLE_SMTP */
|
||||
|
||||
/* convert LF to CRLF if so asked */
|
||||
if((!sending_http_headers) && (
|
||||
#ifdef CURL_DO_LINEEND_CONV
|
||||
@ -962,6 +953,14 @@ static CURLcode readwrite_upload(struct SessionHandle *data,
|
||||
that instead of reading more data */
|
||||
}
|
||||
|
||||
#ifndef CURL_DISABLE_SMTP
|
||||
if(conn->handler->protocol & PROTO_FAMILY_SMTP) {
|
||||
result = Curl_smtp_escape_eob(conn, nread);
|
||||
if(result)
|
||||
return result;
|
||||
}
|
||||
#endif /* CURL_DISABLE_SMTP */
|
||||
|
||||
/* write to socket (send away data) */
|
||||
result = Curl_write(conn,
|
||||
conn->writesockfd, /* socket to send to */
|
||||
|
Loading…
Reference in New Issue
Block a user