Blob Blame History Raw
From 1ccdb4549499dcf12b938ac28c7e3646e83bdf1b Mon Sep 17 00:00:00 2001
From: Daniel Stenberg <daniel@haxx.se>
Date: Thu, 17 Feb 2011 23:51:43 +0100
Subject: [PATCH 1/3] multi: better failed connect treatment

When failing to connect the protocol during the CURLM_STATE_PROTOCONNECT
state, Curl_done() has to be called with the premature flag set TRUE as
for the pingpong protocols this can be important.

When Curl_done() is called with premature == TRUE, it needs to call
Curl_disconnect() with its 'dead_connection' argument set to TRUE as
well so that any protocol handler's disconnect function won't attempt to
use the (control) connection for anything.

This problem caused the pingpong protocols to fail to disconnect when
STARTTLS failed.

Reported by: Alona Rossen
Bug: http://curl.haxx.se/mail/lib-2011-02/0195.html

Signed-off-by: Kamil Dudka <kdudka@redhat.com>
---
 lib/multi.c |    2 +-
 lib/url.c   |    2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/lib/multi.c b/lib/multi.c
index ff4bf86..6555ee6 100644
--- a/lib/multi.c
+++ b/lib/multi.c
@@ -1189,7 +1189,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
       else if(easy->result) {
         /* failure detected */
         Curl_posttransfer(data);
-        Curl_done(&easy->easy_conn, easy->result, FALSE);
+        Curl_done(&easy->easy_conn, easy->result, TRUE);
         disconnect_conn = TRUE;
       }
       break;
diff --git a/lib/url.c b/lib/url.c
index d6e9d09..29fd43a 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -5233,7 +5233,7 @@ CURLcode Curl_done(struct connectdata **connp,
   */
   if(data->set.reuse_forbid || conn->bits.close || premature ||
      (-1 == conn->connectindex)) {
-    CURLcode res2 = Curl_disconnect(conn, FALSE); /* close the connection */
+    CURLcode res2 = Curl_disconnect(conn, premature); /* close the connection */
 
     /* If we had an error already, make sure we return that one. But
        if we got a new error, return that. */
-- 
1.7.4.4


From e727dc4344fc5077c5b268045392f65b4f99c0f8 Mon Sep 17 00:00:00 2001
From: Mike Crowe <mac@mcrowe.com>
Date: Fri, 18 Feb 2011 23:19:14 +0100
Subject: [PATCH 2/3] multi: close connection on timeout

After a request times out, the connection wasn't properly closed and
prevented to get re-used, so subsequent transfers could still mistakenly
get to use the previously aborted connection.

Signed-off-by: Kamil Dudka <kdudka@redhat.com>
---
 lib/multi.c |    5 +++++
 1 files changed, 5 insertions(+), 0 deletions(-)

diff --git a/lib/multi.c b/lib/multi.c
index 6555ee6..4d50b9c 100644
--- a/lib/multi.c
+++ b/lib/multi.c
@@ -1003,6 +1003,11 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
                 Curl_tvdiff(now, data->progress.t_startsingle), k->bytecount,
                 k->size);
         }
+
+        /* Force the connection closed because the server could continue to
+           send us stuff at any time. (The disconnect_conn logic used below
+           doesn't work at this point). */
+        easy->easy_conn->bits.close = TRUE;
         easy->result = CURLE_OPERATION_TIMEDOUT;
         multistate(easy, CURLM_STATE_COMPLETED);
         break;
-- 
1.7.4.4


From 4f98cb97d689b1ef15d089a27fb0191b7de1c00c Mon Sep 17 00:00:00 2001
From: Daniel Stenberg <daniel@haxx.se>
Date: Thu, 28 Apr 2011 09:39:33 +0200
Subject: [PATCH 3/3] multi-socks: fix connect to proxy

When connecting to a socks or similar proxy we do the proxy handshake at
once when we know the TCP connect is completed and we only consider the
"connection" complete after the proxy handshake. This fixes test 564
which is now no longer considered disabled.

Reported by: Dmitri Shubin
Bug: http://curl.haxx.se/mail/lib-2011-04/0127.html

Signed-off-by: Kamil Dudka <kdudka@redhat.com>
---
 lib/connect.c       |    8 +++++++-
 lib/multi.c         |    2 --
 tests/data/DISABLED |    1 -
 tests/data/test564  |    7 ++-----
 4 files changed, 9 insertions(+), 9 deletions(-)

diff --git a/lib/connect.c b/lib/connect.c
index 7638854..8da2527 100644
--- a/lib/connect.c
+++ b/lib/connect.c
@@ -686,7 +686,13 @@ CURLcode Curl_is_connected(struct connectdata *conn,
 
   if(WAITCONN_CONNECTED == rc) {
     if(verifyconnect(sockfd, &error)) {
-      /* we are connected, awesome! */
+      /* we are connected with TCP, awesome! */
+
+      /* see if we need to do any proxy magic first once we connected */
+      code = Curl_connected_proxy(conn);
+      if(code)
+        return code;
+
       conn->bits.tcpconnect = TRUE;
       *connected = TRUE;
       Curl_pgrsTime(data, TIMER_CONNECT); /* connect done */
diff --git a/lib/multi.c b/lib/multi.c
index 4d50b9c..575284b 100644
--- a/lib/multi.c
+++ b/lib/multi.c
@@ -1140,8 +1140,6 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
                                        FIRSTSOCKET,
                                        &connected);
       if(connected) {
-        /* see if we need to do any proxy magic first once we connected */
-        easy->result = Curl_connected_proxy(easy->easy_conn);
 
         if(!easy->result)
           /* if everything is still fine we do the protocol-specific connect
diff --git a/tests/data/DISABLED b/tests/data/DISABLED
index b6071cb..96328f1 100644
--- a/tests/data/DISABLED
+++ b/tests/data/DISABLED
@@ -2,4 +2,3 @@
 # test cases are run by runtests.pl. Just add the plain test case numbers, one
 # per line.
 # Lines starting with '#' letters are treated as comments.
-564
diff --git a/tests/data/test564 b/tests/data/test564
index 6d0609d..72bf129 100644
--- a/tests/data/test564
+++ b/tests/data/test564
@@ -47,11 +47,8 @@ PWD
 CWD path
 EPSV
 TYPE I
-SIZE 546
-RETR 546
-EPSV
-SIZE 546
-RETR 546
+SIZE 564
+RETR 564
 QUIT
 </protocol>
 <stdout>
-- 
1.7.4.4