]> granicus.if.org Git - curl/commitdiff
SMTP: only send SIZE if supported
authorFrantišek Kučera <fiki@robot.frantovo.cz>
Sun, 2 Sep 2012 08:53:27 +0000 (10:53 +0200)
committerDaniel Stenberg <daniel@haxx.se>
Tue, 4 Sep 2012 14:54:41 +0000 (16:54 +0200)
SMTP client will send SIZE parameter in MAIL FROM command only if server
supports it. Without this patch server might say "504 Command parameter
not implemented" and reject the message.

Bug: http://curl.haxx.se/bug/view.cgi?id=3564114

lib/smtp.c
lib/smtp.h

index 81c069f7d255b44a0b7c41186b7896fc2e011d40..b73bb2d890767f0061810f977db750a93c49db26 100644 (file)
@@ -232,6 +232,11 @@ static int smtp_endofresp(struct pingpong *pp, int *resp)
   line += 4;
   len -= 4;
 
+  if(smtpc->state == SMTP_EHLO && len >= 4 && !memcmp(line, "SIZE", 4)) {
+    DEBUGF(infof(conn->data, "Server supports SIZE extension.\n"));
+    smtpc->size_supported = true;
+  }
+
   if(smtpc->state == SMTP_EHLO && len >= 5 && !memcmp(line, "AUTH ", 5)) {
     line += 5;
     len -= 5;
@@ -943,7 +948,7 @@ static CURLcode smtp_mail(struct connectdata *conn)
   }
 
   /* calculate the optional SIZE parameter */
-  if(conn->data->set.infilesize > 0) {
+  if(conn->proto.smtpc.size_supported && conn->data->set.infilesize > 0) {
     size = aprintf("%" FORMAT_OFF_T, data->set.infilesize);
 
     if(!size) {
index 38fd1b70af5043a59c4403f42d0ac39d2155abd2..d68a659b5936e6e117e8082b64ab4c048bc97a2e 100644 (file)
@@ -66,6 +66,8 @@ struct smtp_conn {
   struct curl_slist *rcpt; /* Recipient list */
   bool ssldone;            /* Is connect() over SSL done? only relevant in
                               multi mode */
+  bool size_supported;     /* If server supports SIZE extension according to
+                              RFC 1870 */
 };
 
 extern const struct Curl_handler Curl_handler_smtp;