summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2018-03-16 12:03:52 +0100
committerDaniel Stenberg <daniel@haxx.se>2018-03-16 12:03:52 +0100
commit26d3d2384b1aa336f7a2634c3c3068a46a8cfa52 (patch)
tree2d448cd4378981e28163ccc7a48ad0720c27972d
parentf5700ea88baa5baeb63b7cd42bd12fb03f4e0f4e (diff)
downloadcurl-bagder/pause-update-socket-state.tar.gz
pause: when changing pause state, update socket statebagder/pause-update-socket-state
Especially unpausing a transfer might have to move the socket back to the "currently used sockets" hash to get monitored. Otherwise it would never get any more data and get stuck. Easily triggered with pausing using the multi_socket API. Reported-by: Philip Prindeville Bug: https://curl.haxx.se/mail/lib-2018-03/0048.html
-rw-r--r--lib/easy.c4
-rw-r--r--lib/multi.c6
-rw-r--r--lib/multiif.h3
3 files changed, 12 insertions, 1 deletions
diff --git a/lib/easy.c b/lib/easy.c
index 64c647be2..fa34c3827 100644
--- a/lib/easy.c
+++ b/lib/easy.c
@@ -1099,6 +1099,10 @@ CURLcode curl_easy_pause(struct Curl_easy *data, int action)
(KEEP_RECV_PAUSE|KEEP_SEND_PAUSE)) )
Curl_expire(data, 0, EXPIRE_RUN_NOW); /* get this handle going again */
+ /* This transfer may have been moved in or out of the bundle, update
+ the corresponding socket callback, if used */
+ Curl_updatesocket(data);
+
return result;
}
diff --git a/lib/multi.c b/lib/multi.c
index 69df90288..2f139ab37 100644
--- a/lib/multi.c
+++ b/lib/multi.c
@@ -2421,6 +2421,12 @@ static void singlesocket(struct Curl_multi *multi,
data->numsocks = num;
}
+void Curl_updatesocket(struct Curl_easy *data)
+{
+ singlesocket(data->multi, data);
+}
+
+
/*
* Curl_multi_closed()
*
diff --git a/lib/multiif.h b/lib/multiif.h
index a988bfd4a..b9c722aed 100644
--- a/lib/multiif.h
+++ b/lib/multiif.h
@@ -7,7 +7,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
- * Copyright (C) 1998 - 2017, Daniel Stenberg, <daniel@haxx.se>, et al.
+ * Copyright (C) 1998 - 2018, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
@@ -26,6 +26,7 @@
* Prototypes for library-wide functions provided by multi.c
*/
+void Curl_updatesocket(struct Curl_easy *data);
void Curl_expire(struct Curl_easy *data, time_t milli, expire_id);
void Curl_expire_clear(struct Curl_easy *data);
void Curl_expire_done(struct Curl_easy *data, expire_id id);