]> granicus.if.org Git - curl/commitdiff
smtp: Fixed dot stuffing being performed when no new data read
authorSteve Holme <steve_holme@hotmail.com>
Sun, 30 Nov 2014 14:24:35 +0000 (14:24 +0000)
committerSteve Holme <steve_holme@hotmail.com>
Sun, 30 Nov 2014 14:24:35 +0000 (14:24 +0000)
Whilst I had moved the dot stuffing code from being performed before
CRLF conversion takes place to after it, in commit 4bd860a001, I had
moved it outside the 'when something read' block of code when meant
it could perform the dot stuffing twice on partial send if nread
happened to contain the right values. It also meant the function could
potentially read past the end of buffer. This was highlighted by the
following warning:

warning: `nread' might be used uninitialized in this function

lib/transfer.c

index 2324f2bdda451ee37c5ae1a0183ec76e9d7d7a48..84a7e2be44faedb6f025216717d7b232e6348e92 100644 (file)
@@ -935,6 +935,7 @@ static CURLcode readwrite_upload(struct SessionHandle *data,
           else
             data->state.scratch[si] = data->req.upload_fromhere[i];
         }
+
         if(si != nread) {
           /* only perform the special operation if we really did replace
              anything */
@@ -947,20 +948,20 @@ static CURLcode readwrite_upload(struct SessionHandle *data,
           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;
+      }
+#endif /* CURL_DISABLE_SMTP */
     } /* if 0 == data->req.upload_present */
     else {
       /* We have a partial buffer left from a previous "round". Use
          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 */