diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/smtp.c | 30 | ||||
-rw-r--r-- | lib/transfer.c | 17 |
2 files changed, 29 insertions, 18 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; } diff --git a/lib/transfer.c b/lib/transfer.c index b48dfce84..2324f2bdd 100644 --- a/lib/transfer.c +++ b/lib/transfer.c @@ -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 */ |