Dmitry Kurochkin: In "real world" testing I found more bugs in
authorDaniel Stenberg <daniel@haxx.se>
Sun, 27 Jan 2008 22:53:09 +0000 (22:53 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Sun, 27 Jan 2008 22:53:09 +0000 (22:53 +0000)
pipelining. Broken connection is not restored and we get into infinite
loop. It happens because of wrong is_in_pipeline values.

CHANGES
lib/multi.c

diff --git a/CHANGES b/CHANGES
index 69069e4..2d36ec5 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -6,6 +6,11 @@
 
                                   Changelog
 
+Daniel S (27 Jan 2008)
+- Dmitry Kurochkin: In "real world" testing I found more bugs in
+  pipelining. Broken connection is not restored and we get into infinite
+  loop. It happens because of wrong is_in_pipeline values.
+
 Daniel S (26 Jan 2008)
 - Kevin Reed filed bug report #1879375
   (http://curl.haxx.se/bug/view.cgi?id=1879375) which describes how libcurl
index f52cce5..5aac09e 100644 (file)
@@ -871,6 +871,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
       if(easy->easy_handle->state.is_in_pipeline) {
         /* Head back to the CONNECT state */
         multistate(easy, CURLM_STATE_CONNECT);
+        easy->easy_handle->state.is_in_pipeline = FALSE;
         result = CURLM_CALL_MULTI_PERFORM;
         easy->result = CURLE_OK;
       }
@@ -1286,6 +1287,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
         easy->easy_conn->bits.close = TRUE;
         Curl_removeHandleFromPipeline(easy->easy_handle,
                                       easy->easy_conn->recv_pipe);
+        easy->easy_handle->state.is_in_pipeline = FALSE;
 
         if(CURL_SOCKET_BAD != easy->easy_conn->sock[SECONDARYSOCKET]) {
           /* if we failed anywhere, we must clean up the secondary socket if
@@ -1309,6 +1311,7 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi,
                                         easy->easy_conn->recv_pipe);
           /* Check if we can move pending requests to send pipe */
           checkPendPipeline(easy->easy_conn);
+          easy->easy_handle->state.is_in_pipeline = FALSE;
           if(!retry) {
             /* if the URL is a follow-location and not just a retried request
                then figure out the URL here */