From 452e52f95824a7d2a761c336ba5a006209ce1e9f Mon Sep 17 00:00:00 2001 From: Daniel Stenberg Date: Sat, 10 Jan 2009 22:10:57 +0000 Subject: [PATCH] - Emil Romanus fixed: When using the multi interface over HTTP and the server returns a Location header, the running easy handle will get stuck in the CURLM_STATE_PERFORM state, leaving the external event loop stuck waiting for data from the ingoing socket (when using the curl_multi_socket_action stuff). While this bug was pretty hard to find, it seems to require only a one-line fix. The break statement on line 1374 in multi.c caused the function to skip the call to multistate(). How to reproduce this bug? Well, that's another question. evhiperfifo.c in the examples directory chokes on this bug only _sometimes_, probably depending on how fast the URLs are added. One way of testing the bug out is writing to hiper.fifo from more than one source at the same time. --- CHANGES | 22 +++++++++++++++++++--- RELEASE-NOTES | 4 +++- lib/multi.c | 3 +-- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/CHANGES b/CHANGES index b92b229fb..46335ee6f 100644 --- a/CHANGES +++ b/CHANGES @@ -7,11 +7,27 @@ Changelog +Daniel Stenberg (10 Jan 2009) +- Emil Romanus fixed: + + When using the multi interface over HTTP and the server returns a Location + header, the running easy handle will get stuck in the CURLM_STATE_PERFORM + state, leaving the external event loop stuck waiting for data from the + ingoing socket (when using the curl_multi_socket_action stuff). While this + bug was pretty hard to find, it seems to require only a one-line fix. The + break statement on line 1374 in multi.c caused the function to skip the call + to multistate(). + + How to reproduce this bug? Well, that's another question. evhiperfifo.c in + the examples directory chokes on this bug only _sometimes_, probably + depending on how fast the URLs are added. One way of testing the bug out is + writing to hiper.fifo from more than one source at the same time. + Daniel Fandrich (7 Jan 2009) - Unified much of the SessionHandle initialization done in Curl_open() and - curl_easy_reset() by creating Curl_init_userdefined(). This had the side effect - of fixing curl_easy_reset() so it now also resets CURLOPT_FTP_FILEMETHOD and - CURLOPT_SSL_SESSIONID_CACHE + curl_easy_reset() by creating Curl_init_userdefined(). This had the side + effect of fixing curl_easy_reset() so it now also resets + CURLOPT_FTP_FILEMETHOD and CURLOPT_SSL_SESSIONID_CACHE Daniel Stenberg (7 Jan 2009) - Rob Crittenden did once again provide an NSS update: diff --git a/RELEASE-NOTES b/RELEASE-NOTES index aefebf4d2..88daf1753 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -42,6 +42,7 @@ This release includes the following bugfixes: o TTL "leak" in the DNS cache o improved NSS initing o curl_easy_reset now resets more options + o rare Location: follow bug with the multi interface This release includes the following known bugs: @@ -53,6 +54,7 @@ advice from friends like these: Yang Tse, Daniel Fandrich, Jim Meyering, Christian Krause, Andreas Wurf, Markus Koetter, Josef Wolf, Vlad Grachov, Pawel Kierski, Igor Novoseltsev, Fred Machado, Ken Hirsch, Keshav Krity, Patrick Monnerat, Mark Karpeles, - Anthony Bryan, Peter Korsgaard, Phil Lisiecki, Bas Mevissen, Rob Crittenden + Anthony Bryan, Peter Korsgaard, Phil Lisiecki, Bas Mevissen, Rob Crittenden, + Emil Romanus Thanks! (and sorry if I forgot to mention someone) diff --git a/lib/multi.c b/lib/multi.c index 7c5852ab3..d5ddc0873 100644 --- a/lib/multi.c +++ b/lib/multi.c @@ -5,7 +5,7 @@ * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * - * Copyright (C) 1998 - 2008, Daniel Stenberg, , et al. + * Copyright (C) 1998 - 2009, Daniel Stenberg, , et al. * * This software is licensed as described in the file COPYING, which * you should have received as part of this distribution. The terms @@ -1371,7 +1371,6 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi, easy->result = Curl_follow(easy->easy_handle, newurl, FOLLOW_FAKE); if (easy->result) free(newurl); - break; } multistate(easy, CURLM_STATE_DONE);