]> granicus.if.org Git - curl/commitdiff
pop3.c: Fixed failure detection during TLS upgrade
authorSteve Holme <steve_holme@hotmail.com>
Thu, 24 Jan 2013 20:24:39 +0000 (20:24 +0000)
committerSteve Holme <steve_holme@hotmail.com>
Thu, 24 Jan 2013 20:24:39 +0000 (20:24 +0000)
pop3_state_upgrade_tls() would attempt to incorrectly complete the
upgrade to pop3s and start the CAPA 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/pop3.c

index eabcd3004c587d50d8063cc88d315bae375183b2..9a9e81b20bef4b93d23f6d968b2923f2fe02ef44 100644 (file)
@@ -568,10 +568,8 @@ static CURLcode pop3_state_starttls_resp(struct connectdata *conn,
     else
       result = pop3_state_capa(conn);
   }
-  else {
-    state(conn, POP3_UPGRADETLS);
+  else
     result = pop3_state_upgrade_tls(conn);
-  }
 
   return result;
 }
@@ -583,9 +581,14 @@ static CURLcode pop3_state_upgrade_tls(struct connectdata *conn)
 
   result = Curl_ssl_connect_nonblocking(conn, FIRSTSOCKET, &pop3c->ssldone);
 
-  if(pop3c->ssldone) {
-    pop3_to_pop3s(conn);
-    result = pop3_state_capa(conn);
+  if(!result) {
+    if(pop3c->state != POP3_UPGRADETLS)
+      state(conn, POP3_UPGRADETLS);
+
+    if(pop3c->ssldone) {
+      pop3_to_pop3s(conn);
+      result = pop3_state_capa(conn);
+    }
   }
 
   return result;