]> granicus.if.org Git - curl/commitdiff
smtp: Added support for the conversion of Unix newlines during mail send
authorSteve Holme <steve_holme@hotmail.com>
Wed, 26 Nov 2014 22:44:28 +0000 (22:44 +0000)
committerSteve Holme <steve_holme@hotmail.com>
Wed, 26 Nov 2014 23:31:54 +0000 (23:31 +0000)
Added support for the automatic conversion of Unix newlines to CRLF
during mail uploads.

Feature: http://curl.haxx.se/bug/view.cgi?id=1456

lib/smtp.c
lib/transfer.c

index 5f65243573bb1defb6b93ad25fe2e7576411220e..2dbd2ea30a357c9ffa99fd60da68aa30120a9cf2 100644 (file)
@@ -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;
 }
index b48dfce848eb99c32c93a7098f86ab6162f51cdd..2324f2bdda451ee37c5ae1a0183ec76e9d7d7a48 100644 (file)
@@ -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 */