]> granicus.if.org Git - curl/commitdiff
- Jack Zhang reported a problem with SMTP: we wrongly used multiple addresses
authorDaniel Stenberg <daniel@haxx.se>
Fri, 12 Feb 2010 22:23:46 +0000 (22:23 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Fri, 12 Feb 2010 22:23:46 +0000 (22:23 +0000)
  in the same RCPT TO line, when they should be sent in separate single
  commands. I updated test case 802 to verify this.

- I also fixed a bad use of my_setopt_str() of CURLOPT_MAIL_RCPT in the curl
  tool which made it try to output it as string for the --libcurl feature
  which could lead to crashes.

CHANGES
RELEASE-NOTES
lib/smtp.c
lib/smtp.h
tests/data/test802

diff --git a/CHANGES b/CHANGES
index de150ba18e21b2586582c2158dd00de17611d253..feb11cbd467ee8b63e112afbf6e2b9fff81acdc6 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -6,6 +6,15 @@
 
                                   Changelog
 
+Daniel Stenberg (12 Feb 2010)
+- Jack Zhang reported a problem with SMTP: we wrongly used multiple addresses
+  in the same RCPT TO line, when they should be sent in separate single
+  commands. I updated test case 802 to verify this.
+
+- I also fixed a bad use of my_setopt_str() of CURLOPT_MAIL_RCPT in the curl
+  tool which made it try to output it as string for the --libcurl feature
+  which could lead to crashes.
+
 Yang Tse (11 Feb 2010)
 - Steven M. Schweda fixed VMS builder bad behavior when used in a batch job,
   removed obsolete batch_compile.com and defines.com and updated VMS readme.
index 3a1f9e33e93dd7a6eea5f315837acd41975d5969..6a8458e23272149071d819cb0e7af8fb42e322da 100644 (file)
@@ -14,6 +14,7 @@ This release includes the following changes:
 This release includes the following bugfixes:
 
  o VMS builder bad behavior when used in a batch job
+ o multiple recepients with SMTP
 
 This release includes the following known bugs:
 
@@ -22,6 +23,6 @@ This release includes the following known bugs:
 This release would not have looked like this without help, code, reports and
 advice from friends like these:
 
- Steven M. Schweda
+ Steven M. Schweda, Yang Tse, Jack Zhang
 
         Thanks! (and sorry if I forgot to mention someone)
index 1e53047239bfc87f12ea97e5cca656fdc9232d30..7e3d4670c17584be41ef1daff9e36b3628a4a104 100644 (file)
@@ -344,26 +344,17 @@ static CURLcode smtp_state_mail_resp(struct connectdata *conn,
     state(conn, SMTP_STOP);
   }
   else {
-    /* send RCPT TO */
-    struct curl_slist *rcpt;
-    char *buffer = NULL;
-
-    for(rcpt = data->set.mail_rcpt; rcpt; rcpt=rcpt->next) {
-      char *add = aprintf("%s%s%s", buffer?buffer:"", buffer?", ":"",
-                          rcpt->data);
-      if(!add) {
-        free(buffer);
-        return CURLE_OUT_OF_MEMORY;
-      }
-      buffer = add;
-    }
+    struct smtp_conn *smtpc = &conn->proto.smtpc;
 
-    result = Curl_pp_sendf(&conn->proto.smtpc.pp, "RCPT TO:%s", buffer);
-
-    free(buffer);
+    /* send RCPT TO */
+    smtpc->rcpt = data->set.mail_rcpt;
 
-    if(result)
-      return result;
+    if(smtpc->rcpt) {
+      result = Curl_pp_sendf(&conn->proto.smtpc.pp, "RCPT TO:%s",
+                             smtpc->rcpt->data);
+      if(result)
+        return result;
+    }
 
     state(conn, SMTP_RCPT);
   }
@@ -385,6 +376,20 @@ static CURLcode smtp_state_rcpt_resp(struct connectdata *conn,
     state(conn, SMTP_STOP);
   }
   else {
+    struct smtp_conn *smtpc = &conn->proto.smtpc;
+
+    /* one RCPT is done, but if there's one more to send go on */
+    smtpc->rcpt = smtpc->rcpt->next;
+    if(smtpc->rcpt) {
+      result = Curl_pp_sendf(&conn->proto.smtpc.pp, "RCPT TO:%s",
+                             smtpc->rcpt->data);
+      if(result)
+        return result;
+
+      state(conn, SMTP_RCPT);
+      return CURLE_OK;
+    }
+
     /* send DATA */
     result = Curl_pp_sendf(&conn->proto.smtpc.pp, "DATA", "");
     if(result)
index a1115e23a1c40f1784ac8294a70670b3ffb48a2c..cc581d4d5870f676a6c65e13bc2a318b29bb55aa 100644 (file)
@@ -7,7 +7,7 @@
  *                            | (__| |_| |  _ <| |___
  *                             \___|\___/|_| \_\_____|
  *
- * Copyright (C) 2009, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 2009 - 2010, Daniel Stenberg, <daniel@haxx.se>, et al.
  *
  * This software is licensed as described in the file COPYING, which
  * you should have received as part of this distribution. The terms
@@ -49,6 +49,7 @@ struct smtp_conn {
   int eob;         /* number of bytes of the EOB (End Of Body) that has been
                       received thus far */
   smtpstate state; /* always use smtp.c:state() to change state! */
+  struct curl_slist *rcpt;
 };
 
 extern const struct Curl_handler Curl_handler_smtp;
index dedc1e1fd9d405261fe34ca610459b2e1564c599..d3114137d78224c93e5f4557b441f7ebc0c1007e 100644 (file)
@@ -26,7 +26,7 @@ To: another
 body
 </stdin>
  <command>
-smtp://%HOSTIP:%SMTPPORT/user --mail-rcpt 802@foo --mail-from 802@from -T -
+smtp://%HOSTIP:%SMTPPORT/user --mail-rcpt 802@foo --mail-rcpt 802@foobar.example --mail-from 802@from -T -
 </command>
 </client>
 
@@ -37,6 +37,7 @@ smtp://%HOSTIP:%SMTPPORT/user --mail-rcpt 802@foo --mail-from 802@from -T -
 EHLO user\r
 MAIL FROM:802@from\r
 RCPT TO:802@foo\r
+RCPT TO:802@foobar.example\r
 DATA\r
 QUIT\r
 </protocol>