]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
imap.c: Fixed failure detection during TLS upgrade
authorSteve Holme <steve_holme@hotmail.com>
Thu, 24 Jan 2013 20:22:20 +0000 (20:22 +0000)
committerSteve Holme <steve_holme@hotmail.com>
Thu, 24 Jan 2013 20:22:20 +0000 (20:22 +0000)
imap_state_upgrade_tls() would attempt to incorrectly complete the
upgrade to imaps and start the CAPABILITY 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/imap.c

index 288d1994f349aef0c1e0da35016f70f493839900..5e845fb356e598a6233108edec21cfa09768229c 100644 (file)
@@ -627,10 +627,8 @@ static CURLcode imap_state_starttls_resp(struct connectdata *conn,
     else
       result = imap_state_capability(conn);
   }
-  else {
-    state(conn, IMAP_UPGRADETLS);
+  else
     result = imap_state_upgrade_tls(conn);
-  }
 
   return result;
 }
@@ -642,9 +640,14 @@ static CURLcode imap_state_upgrade_tls(struct connectdata *conn)
 
   result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET, &imapc->ssldone);
 
-  if(imapc->ssldone) {
-    imap_to_imaps(conn);
-    result = imap_state_capability(conn);
+  if(!result) {
+    if(imapc->state != IMAP_UPGRADETLS)
+      state(conn, IMAP_UPGRADETLS);
+
+    if(imapc->ssldone) {
+      imap_to_imaps(conn);
+      result = imap_state_capability(conn);
+    }
   }
 
   return result;