]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
smtp.c: Fixed failure detection during TLS upgrade
authorSteve Holme <steve_holme@hotmail.com>
Thu, 24 Jan 2013 20:27:43 +0000 (20:27 +0000)
committerSteve Holme <steve_holme@hotmail.com>
Thu, 24 Jan 2013 20:27:43 +0000 (20:27 +0000)
smtp_state_upgrade_tls() would attempt to incorrectly complete the
upgrade to smtps and start the EHLO command if
Curl_ssl_connect_nonblocking() returned a failure code and if ssldone
was set to TRUE. This would only happen when a non-blocking API hadn't
been provided by the SSL implementation and curlssl_connect() was
called underneath.

lib/smtp.c

index 05c0a780a28853fa24eff2272705f1cd6d999203..36ad58687131f58f94aaed0dbcb4f8a6e81dcb8f 100644 (file)
@@ -490,10 +490,8 @@ static CURLcode smtp_state_starttls_resp(struct connectdata *conn,
     else
       result = smtp_authenticate(conn);
   }
-  else {
-    state(conn, SMTP_UPGRADETLS);
+  else
     result = smtp_state_upgrade_tls(conn);
-  }
 
   return result;
 }
@@ -505,9 +503,14 @@ static CURLcode smtp_state_upgrade_tls(struct connectdata *conn)
 
   result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET, &smtpc->ssldone);
 
-  if(smtpc->ssldone) {
-    smtp_to_smtps(conn);
-    result = smtp_state_ehlo(conn);
+  if(!result) {
+    if(smtpc->state != SMTP_UPGRADETLS)
+      state(conn, SMTP_UPGRADETLS);
+
+    if(smtpc->ssldone) {
+      smtp_to_smtps(conn);
+      result = smtp_state_ehlo(conn);
+    }
   }
 
   return result;