diff options
author | Daniel Stenberg <daniel@haxx.se> | 2010-02-12 22:23:46 +0000 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2010-02-12 22:23:46 +0000 |
commit | 975814368a8b567a369ab5174c42dbae5b28b86e (patch) | |
tree | e01a31b4d49a91dd7c8099e3688c5024dee8aaf7 | |
parent | dc6adb54fbf1c3678e71f0ce281ba37e0d7e2b83 (diff) |
- 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.
-rw-r--r-- | CHANGES | 9 | ||||
-rw-r--r-- | RELEASE-NOTES | 3 | ||||
-rw-r--r-- | lib/smtp.c | 41 | ||||
-rw-r--r-- | lib/smtp.h | 3 | ||||
-rw-r--r-- | tests/data/test802 | 3 |
5 files changed, 38 insertions, 21 deletions
@@ -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. diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 3a1f9e33e..6a8458e23 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -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) diff --git a/lib/smtp.c b/lib/smtp.c index 1e5304723..7e3d4670c 100644 --- a/lib/smtp.c +++ b/lib/smtp.c @@ -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) diff --git a/lib/smtp.h b/lib/smtp.h index a1115e23a..cc581d4d5 100644 --- a/lib/smtp.h +++ b/lib/smtp.h @@ -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; diff --git a/tests/data/test802 b/tests/data/test802 index dedc1e1fd..d3114137d 100644 --- a/tests/data/test802 +++ b/tests/data/test802 @@ -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
MAIL FROM:802@from
RCPT TO:802@foo
+RCPT TO:802@foobar.example
DATA
QUIT
</protocol> |