diff --git a/curl-7.19.7-s390-sleep.patch b/curl-7.19.7-s390-sleep.patch deleted file mode 100644 index 256c9bf..0000000 --- a/curl-7.19.7-s390-sleep.patch +++ /dev/null @@ -1,16 +0,0 @@ - tests/runtests.pl | 2 +- - 1 files changed, 1 insertions(+), 1 deletions(-) - -diff --git a/tests/runtests.pl b/tests/runtests.pl -index 6e3b5b9..75386b8 100755 ---- a/tests/runtests.pl -+++ b/tests/runtests.pl -@@ -221,7 +221,7 @@ my $sshdverstr; # for socks server, ssh daemon version string - my $sshderror; # for socks server, ssh daemon version error - - my $defserverlogslocktimeout = 20; # timeout to await server logs lock removal --my $defpostcommanddelay = 0; # delay between command and postcheck sections -+my $defpostcommanddelay = 1; # delay between command and postcheck sections - - my $timestats; # time stamping and stats generation - my $fullstats; # show time stats for every single test diff --git a/curl-7.20.1-157f20f.patch b/curl-7.20.1-157f20f.patch new file mode 100644 index 0000000..684864f --- /dev/null +++ b/curl-7.20.1-157f20f.patch @@ -0,0 +1,51 @@ +From 157f20fd2ce7d8519b863e57f3d77d17fb41bc9c Mon Sep 17 00:00:00 2001 +From: Kamil Dudka +Date: Sat, 24 Apr 2010 23:21:13 +0200 +Subject: [PATCH] nss: fix SSL handshake timeout underflow + + lib/nss.c | 10 +++++++++- + 2 files changed, 12 insertions(+), 1 deletions(-) + +diff --git a/CHANGES b/CHANGES +index 99f04a5..7433364 100644 +--- a/CHANGES ++++ b/CHANGES +@@ -10,6 +10,9 @@ Kamil Dudka (24 Apr 2010) + - Fixed test536 in order to not fail with threaded DNS resolver and tweaked + comments in certain examples using curl_multi_fdset(). + ++- Fixed SSL handshake timeout underflow in libcurl-NSS, which caused test405 ++ to hang on a slow machine. ++ + Version 7.20.1 (14 April 2010) + + Daniel Stenberg (9 Apr 2010) +diff --git a/lib/nss.c b/lib/nss.c +index 0f8ebd5..addb94b 100644 +--- a/lib/nss.c ++++ b/lib/nss.c +@@ -1025,6 +1025,7 @@ CURLcode Curl_nss_connect(struct connectdata *conn, int sockindex) + int curlerr; + const int *cipher_to_enable; + PRSocketOptionData sock_opt; ++ long time_left; + PRUint32 timeout; + + curlerr = CURLE_SSL_CONNECT_ERROR; +@@ -1302,8 +1303,15 @@ CURLcode Curl_nss_connect(struct connectdata *conn, int sockindex) + + SSL_SetURL(connssl->handle, conn->host.name); + ++ /* check timeout situation */ ++ time_left = Curl_timeleft(conn, NULL, TRUE); ++ if(time_left < 0L) { ++ failf(data, "timed out before SSL handshake"); ++ goto error; ++ } ++ timeout = PR_MillisecondsToInterval((PRUint32) time_left); ++ + /* Force the handshake now */ +- timeout = PR_MillisecondsToInterval((PRUint32)Curl_timeleft(conn, NULL, TRUE)); + if(SSL_ForceHandshakeWithTimeout(connssl->handle, timeout) != SECSuccess) { + if(conn->data->set.ssl.certverifyresult == SSL_ERROR_BAD_CERT_DOMAIN) + curlerr = CURLE_PEER_FAILED_VERIFICATION; diff --git a/curl-7.20.1-d487ade.patch b/curl-7.20.1-d487ade.patch new file mode 100644 index 0000000..006974c --- /dev/null +++ b/curl-7.20.1-d487ade.patch @@ -0,0 +1,236 @@ +From d487ade72c5f31703ce097e8460e0225fad80348 Mon Sep 17 00:00:00 2001 +From: Kamil Dudka +Date: Sat, 24 Apr 2010 12:14:21 +0200 +Subject: [PATCH] test536: do not fail with threaded DNS resolver + +Also tweaked comments in certain examples using curl_multi_fdset(). +--- + CHANGES | 4 ++++ + docs/examples/fopen.c | 8 +++++--- + docs/examples/multi-app.c | 8 +++++--- + docs/examples/multi-debugcallback.c | 8 +++++--- + docs/examples/multi-double.c | 8 +++++--- + docs/examples/multi-post.c | 8 +++++--- + docs/examples/multi-single.c | 8 +++++--- + tests/libtest/lib536.c | 16 ++++++++++++---- + 8 files changed, 46 insertions(+), 22 deletions(-) + +diff --git a/CHANGES b/CHANGES +index 9ae615a..99f04a5 100644 +--- a/CHANGES ++++ b/CHANGES +@@ -6,6 +6,10 @@ + + Changelog + ++Kamil Dudka (24 Apr 2010) ++- Fixed test536 in order to not fail with threaded DNS resolver and tweaked ++ comments in certain examples using curl_multi_fdset(). ++ + Version 7.20.1 (14 April 2010) + + Daniel Stenberg (9 Apr 2010) +diff --git a/docs/examples/fopen.c b/docs/examples/fopen.c +index e3814e6..35e24b1 100644 +--- a/docs/examples/fopen.c ++++ b/docs/examples/fopen.c +@@ -131,7 +131,6 @@ fill_buffer(URL_FILE *file,int want,int waittime) + fd_set fdread; + fd_set fdwrite; + fd_set fdexcep; +- int maxfd; + struct timeval timeout; + int rc; + +@@ -144,6 +143,7 @@ fill_buffer(URL_FILE *file,int want,int waittime) + /* attempt to fill buffer */ + do + { ++ int maxfd = -1; + FD_ZERO(&fdread); + FD_ZERO(&fdwrite); + FD_ZERO(&fdexcep); +@@ -156,8 +156,10 @@ fill_buffer(URL_FILE *file,int want,int waittime) + curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); + + /* In a real-world program you OF COURSE check the return code of the +- function calls, *and* you make sure that maxfd is bigger than -1 +- so that the call to select() below makes sense! */ ++ function calls. On success, the value of maxfd is guaranteed to be ++ greater or equal than -1. We call select(maxfd + 1, ...), specially ++ in case of (maxfd == -1), we call select(0, ...), which is basically ++ equal to sleep. */ + + rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); + +diff --git a/docs/examples/multi-app.c b/docs/examples/multi-app.c +index a86dd0e..38b50cd 100644 +--- a/docs/examples/multi-app.c ++++ b/docs/examples/multi-app.c +@@ -66,7 +66,7 @@ int main(int argc, char **argv) + fd_set fdread; + fd_set fdwrite; + fd_set fdexcep; +- int maxfd; ++ int maxfd = -1; + + FD_ZERO(&fdread); + FD_ZERO(&fdwrite); +@@ -80,8 +80,10 @@ int main(int argc, char **argv) + curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); + + /* In a real-world program you OF COURSE check the return code of the +- function calls, *and* you make sure that maxfd is bigger than -1 so +- that the call to select() below makes sense! */ ++ function calls. On success, the value of maxfd is guaranteed to be ++ greater or equal than -1. We call select(maxfd + 1, ...), specially in ++ case of (maxfd == -1), we call select(0, ...), which is basically equal ++ to sleep. */ + + rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); + +diff --git a/docs/examples/multi-debugcallback.c b/docs/examples/multi-debugcallback.c +index b10b47c..8e964c6 100644 +--- a/docs/examples/multi-debugcallback.c ++++ b/docs/examples/multi-debugcallback.c +@@ -140,7 +140,7 @@ int main(int argc, char **argv) + fd_set fdread; + fd_set fdwrite; + fd_set fdexcep; +- int maxfd; ++ int maxfd = -1; + + FD_ZERO(&fdread); + FD_ZERO(&fdwrite); +@@ -154,8 +154,10 @@ int main(int argc, char **argv) + curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); + + /* In a real-world program you OF COURSE check the return code of the +- function calls, *and* you make sure that maxfd is bigger than -1 +- so that the call to select() below makes sense! */ ++ function calls. On success, the value of maxfd is guaranteed to be ++ greater or equal than -1. We call select(maxfd + 1, ...), specially in ++ case of (maxfd == -1), we call select(0, ...), which is basically equal ++ to sleep. */ + + rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); + +diff --git a/docs/examples/multi-double.c b/docs/examples/multi-double.c +index ef3bf92..bc5b446 100644 +--- a/docs/examples/multi-double.c ++++ b/docs/examples/multi-double.c +@@ -57,7 +57,7 @@ int main(int argc, char **argv) + fd_set fdread; + fd_set fdwrite; + fd_set fdexcep; +- int maxfd; ++ int maxfd = -1; + + FD_ZERO(&fdread); + FD_ZERO(&fdwrite); +@@ -71,8 +71,10 @@ int main(int argc, char **argv) + curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); + + /* In a real-world program you OF COURSE check the return code of the +- function calls, *and* you make sure that maxfd is bigger than -1 so +- that the call to select() below makes sense! */ ++ function calls. On success, the value of maxfd is guaranteed to be ++ greater or equal than -1. We call select(maxfd + 1, ...), specially in ++ case of (maxfd == -1), we call select(0, ...), which is basically equal ++ to sleep. */ + + rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); + +diff --git a/docs/examples/multi-post.c b/docs/examples/multi-post.c +index 229e843..0d3f78e 100644 +--- a/docs/examples/multi-post.c ++++ b/docs/examples/multi-post.c +@@ -77,7 +77,7 @@ int main(int argc, char *argv[]) + fd_set fdread; + fd_set fdwrite; + fd_set fdexcep; +- int maxfd; ++ int maxfd = -1; + + FD_ZERO(&fdread); + FD_ZERO(&fdwrite); +@@ -91,8 +91,10 @@ int main(int argc, char *argv[]) + curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); + + /* In a real-world program you OF COURSE check the return code of the +- function calls, *and* you make sure that maxfd is bigger than -1 +- so that the call to select() below makes sense! */ ++ function calls. On success, the value of maxfd is guaranteed to be ++ greater or equal than -1. We call select(maxfd + 1, ...), specially in ++ case of (maxfd == -1), we call select(0, ...), which is basically equal ++ to sleep. */ + + rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); + +diff --git a/docs/examples/multi-single.c b/docs/examples/multi-single.c +index 3e236f3..cba4f32 100644 +--- a/docs/examples/multi-single.c ++++ b/docs/examples/multi-single.c +@@ -51,7 +51,7 @@ int main(int argc, char **argv) + fd_set fdread; + fd_set fdwrite; + fd_set fdexcep; +- int maxfd; ++ int maxfd = -1; + + FD_ZERO(&fdread); + FD_ZERO(&fdwrite); +@@ -65,8 +65,10 @@ int main(int argc, char **argv) + curl_multi_fdset(multi_handle, &fdread, &fdwrite, &fdexcep, &maxfd); + + /* In a real-world program you OF COURSE check the return code of the +- function calls, *and* you make sure that maxfd is bigger than -1 so +- that the call to select() below makes sense! */ ++ function calls. On success, the value of maxfd is guaranteed to be ++ greater or equal than -1. We call select(maxfd + 1, ...), specially in ++ case of (maxfd == -1), we call select(0, ...), which is basically equal ++ to sleep. */ + + rc = select(maxfd+1, &fdread, &fdwrite, &fdexcep, &timeout); + +diff --git a/tests/libtest/lib536.c b/tests/libtest/lib536.c +index 04bc696..e0c19f6 100644 +--- a/tests/libtest/lib536.c ++++ b/tests/libtest/lib536.c +@@ -21,7 +21,7 @@ + + static CURLMcode perform(CURLM * multi) + { +- int handles, maxfd; ++ int handles; + CURLMcode code; + fd_set fdread, fdwrite, fdexcep; + struct timeval mp_start; +@@ -31,6 +31,9 @@ static CURLMcode perform(CURLM * multi) + mp_start = tutil_tvnow(); + + for (;;) { ++ static struct timeval timeout = /* 100 ms */ { 0, 100000L }; ++ int maxfd = -1; ++ + code = curl_multi_perform(multi, &handles); + if (tutil_tvdiff(tutil_tvnow(), mp_start) > + MULTI_PERFORM_HANG_TIMEOUT) { +@@ -53,9 +56,14 @@ static CURLMcode perform(CURLM * multi) + FD_ZERO(&fdwrite); + FD_ZERO(&fdexcep); + curl_multi_fdset(multi, &fdread, &fdwrite, &fdexcep, &maxfd); +- if (maxfd < 0) +- return (CURLMcode) ~CURLM_OK; +- if (select(maxfd + 1, &fdread, &fdwrite, &fdexcep, 0) == -1) ++ ++ /* In a real-world program you OF COURSE check the return code of the ++ function calls. On success, the value of maxfd is guaranteed to be ++ greater or equal than -1. We call select(maxfd + 1, ...), specially in ++ case of (maxfd == -1), we call select(0, ...), which is basically equal ++ to sleep. */ ++ ++ if (select(maxfd + 1, &fdread, &fdwrite, &fdexcep, &timeout) == -1) + return (CURLMcode) ~CURLM_OK; + } + diff --git a/curl-7.20.1-threaded-dns-multi.patch b/curl-7.20.1-threaded-dns-multi.patch deleted file mode 100644 index e7be86e..0000000 --- a/curl-7.20.1-threaded-dns-multi.patch +++ /dev/null @@ -1,40 +0,0 @@ - lib/multi.c | 17 ++++++++++++++++- - 1 files changed, 16 insertions(+), 1 deletions(-) - -diff --git a/lib/multi.c b/lib/multi.c -index 476cb81..74eb0f4 100644 ---- a/lib/multi.c -+++ b/lib/multi.c -@@ -933,9 +933,16 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi, - easy->result = addHandleToSendOrPendPipeline(easy->easy_handle, - easy->easy_conn); - if(CURLE_OK == easy->result) { -- if(async) -+ if(async) { - /* We're now waiting for an asynchronous name lookup */ - multistate(easy, CURLM_STATE_WAITRESOLVE); -+#ifdef USE_THREADS_POSIX -+ /* Curl_resolv_getsock() is not properly implemented in case -+ * we use POSIX threaded DNS resolver, we have to hang */ -+ result = CURLM_CALL_MULTI_PERFORM; -+ break; -+#endif -+ } - else { - /* after the connect has been sent off, go WAITCONNECT unless the - protocol connect is already done and we can go directly to -@@ -1003,6 +1010,14 @@ static CURLMcode multi_runsingle(struct Curl_multi *multi, - disconnect_conn = TRUE; - break; - } -+#ifdef USE_THREADS_POSIX -+ /* Curl_resolv_getsock() is not properly implemented yet in case -+ * we use POSIX threaded DNS resolver, we have to hang */ -+ Curl_socket_ready(CURL_SOCKET_BAD, CURL_SOCKET_BAD, 100 /* ms */); -+ result = CURLM_CALL_MULTI_PERFORM; -+ break; -+#endif -+ - } - break; - diff --git a/curl.spec b/curl.spec index 754c195..bcdb6c1 100644 --- a/curl.spec +++ b/curl.spec @@ -1,7 +1,7 @@ Summary: A utility for getting files from remote servers (FTP, HTTP, and others) Name: curl Version: 7.20.1 -Release: 3%{?dist} +Release: 4%{?dist} License: MIT Group: Applications/Internet Source: http://curl.haxx.se/download/%{name}-%{version}.tar.lzma @@ -10,8 +10,11 @@ Source2: curlbuild.h # upstream commit e32fe30d0cf7c1f7045ac0bd29322e7fb4feb5c8 Patch0: curl-7.20.0-e32fe30.patch -# experimentally enabled threaded DNS lookup -Patch1: curl-7.20.1-threaded-dns-multi.patch +# upstream commit d487ade72c5f31703ce097e8460e0225fad80348 +Patch1: curl-7.20.1-d487ade.patch + +# upstream commit 157f20fd2ce7d8519b863e57f3d77d17fb41bc9c +Patch2: curl-7.20.1-157f20f.patch # patch making libcurl multilib ready Patch101: curl-7.20.0-multilib.patch @@ -104,8 +107,9 @@ done # revert an upstream commit which breaks Fedora builds %patch0 -p1 -R -# upstream patches (not yet applied) +# upstream patches (already applied) %patch1 -p1 +%patch2 -p1 # Fedora patches %patch101 -p1 @@ -215,6 +219,10 @@ rm -rf $RPM_BUILD_ROOT %{_datadir}/aclocal/libcurl.m4 %changelog +* Sat Apr 24 2010 Kamil Dudka 7.20.1-4 +- upstream patch preventing failure of test536 with threaded DNS resolver +- upstream patch preventing SSL handshake timeout underflow + * Thu Apr 22 2010 Paul Howarth 7.20.1-3 - replace Rawhide s390-sleep patch with a more targeted patch adding a delay after tests 513 and 514 rather than after all tests