diff options
author | Anthony G. Basile <blueness@gentoo.org> | 2020-06-10 16:12:56 -0400 |
---|---|---|
committer | Anthony G. Basile <blueness@gentoo.org> | 2020-06-10 16:12:56 -0400 |
commit | 3c70da322b14b83f9894c98725b6ffd3c1ea00cb (patch) | |
tree | 9baae593a5eab62e1942c171d1863f549ac08e1e /net-misc/curl/files | |
parent | sys-apps/haveged: version bump to 1.9.9 (diff) | |
download | gentoo-3c70da322b14b83f9894c98725b6ffd3c1ea00cb.tar.gz gentoo-3c70da322b14b83f9894c98725b6ffd3c1ea00cb.tar.bz2 gentoo-3c70da322b14b83f9894c98725b6ffd3c1ea00cb.zip |
net-misc/curl: remove busy-loop, bug #727352
Closes: https://bugs.gentoo.org/727352
Package-Manager: Portage-2.3.99, Repoman-2.3.22
Signed-off-by: Anthony G. Basile <blueness@gentoo.org>
Diffstat (limited to 'net-misc/curl/files')
-rw-r--r-- | net-misc/curl/files/curl-fix-cpu-load.patch | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/net-misc/curl/files/curl-fix-cpu-load.patch b/net-misc/curl/files/curl-fix-cpu-load.patch new file mode 100644 index 000000000000..fb20641b5b22 --- /dev/null +++ b/net-misc/curl/files/curl-fix-cpu-load.patch @@ -0,0 +1,94 @@ +Fixes https://bugs.gentoo.org/727352 + +From 2a41e236716da4c41ebc1132bd36d9273bd0321f Mon Sep 17 00:00:00 2001 +From: Daniel Stenberg <daniel@haxx.se> +Date: Mon, 8 Jun 2020 14:05:22 +0200 +Subject: [PATCH] socks: detect connection close during handshake + +The SOCKS4/5 state machines weren't properly terminated when the proxy +connection got closed, leading to a busy-loop. + +Reported-By: zloi-user on github +Fixes #5532 +Closes #5542 +--- + lib/socks.c | 32 ++++++++++++++++++++++++++++---- + 1 file changed, 28 insertions(+), 4 deletions(-) + +diff --git a/lib/socks.c b/lib/socks.c +index 4c1af7b9de7..b2215fef30c 100644 +--- a/lib/socks.c ++++ b/lib/socks.c +@@ -382,6 +382,11 @@ CURLcode Curl_SOCKS4(const char *proxy_user, + curl_easy_strerror(result)); + return CURLE_COULDNT_CONNECT; + } ++ else if(!result && !actualread) { ++ /* connection closed */ ++ failf(data, "connection to proxy closed"); ++ return CURLE_COULDNT_CONNECT; ++ } + else if(actualread != sx->outstanding) { + /* remain in reading state */ + sx->outstanding -= actualread; +@@ -592,6 +597,11 @@ CURLcode Curl_SOCKS5(const char *proxy_user, + failf(data, "Unable to receive initial SOCKS5 response."); + return CURLE_COULDNT_CONNECT; + } ++ else if(!result && !actualread) { ++ /* connection closed */ ++ failf(data, "Connection to proxy closed"); ++ return CURLE_COULDNT_CONNECT; ++ } + else if(actualread != sx->outstanding) { + /* remain in reading state */ + sx->outstanding -= actualread; +@@ -717,15 +727,19 @@ CURLcode Curl_SOCKS5(const char *proxy_user, + failf(data, "Unable to receive SOCKS5 sub-negotiation response."); + return CURLE_COULDNT_CONNECT; + } +- if(actualread != sx->outstanding) { ++ else if(!result && !actualread) { ++ /* connection closed */ ++ failf(data, "connection to proxy closed"); ++ return CURLE_COULDNT_CONNECT; ++ } ++ else if(actualread != sx->outstanding) { + /* remain in state */ + sx->outstanding -= actualread; + sx->outp += actualread; + return CURLE_OK; + } +- + /* ignore the first (VER) byte */ +- if(socksreq[1] != 0) { /* status */ ++ else if(socksreq[1] != 0) { /* status */ + failf(data, "User was rejected by the SOCKS5 server (%d %d).", + socksreq[0], socksreq[1]); + return CURLE_COULDNT_CONNECT; +@@ -890,6 +904,11 @@ CURLcode Curl_SOCKS5(const char *proxy_user, + failf(data, "Failed to receive SOCKS5 connect request ack."); + return CURLE_COULDNT_CONNECT; + } ++ else if(!result && !actualread) { ++ /* connection closed */ ++ failf(data, "connection to proxy closed"); ++ return CURLE_COULDNT_CONNECT; ++ } + else if(actualread != sx->outstanding) { + /* remain in state */ + sx->outstanding -= actualread; +@@ -967,7 +986,12 @@ CURLcode Curl_SOCKS5(const char *proxy_user, + failf(data, "Failed to receive SOCKS5 connect request ack."); + return CURLE_COULDNT_CONNECT; + } +- if(actualread != sx->outstanding) { ++ else if(!result && !actualread) { ++ /* connection closed */ ++ failf(data, "connection to proxy closed"); ++ return CURLE_COULDNT_CONNECT; ++ } ++ else if(actualread != sx->outstanding) { + /* remain in state */ + sx->outstanding -= actualread; + sx->outp += actualread; |