summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2020-03-06 10:12:22 +0100
committerDaniel Stenberg <daniel@haxx.se>2020-03-06 17:31:01 +0100
commite54b1885d19dee5ed04761295020a0a84b8296ca (patch)
treeb862d580dc62eec4539ae9c6eb2ffd9c3b6c0f64
parent3c3db98b6fce8d1c6481e300ed4918ccddbd7891 (diff)
downloadcurl-e54b1885d19dee5ed04761295020a0a84b8296ca.tar.gz
pause: bail out on bad input
A NULL easy handle or an easy handle without an associated connection cannot be paused or unpaused. Closes #5050
-rw-r--r--lib/easy.c18
1 files changed, 12 insertions, 6 deletions
diff --git a/lib/easy.c b/lib/easy.c
index 2446557f4..33bc1aab7 100644
--- a/lib/easy.c
+++ b/lib/easy.c
@@ -973,15 +973,21 @@ void curl_easy_reset(struct Curl_easy *data)
*/
CURLcode curl_easy_pause(struct Curl_easy *data, int action)
{
- struct SingleRequest *k = &data->req;
+ struct SingleRequest *k;
CURLcode result = CURLE_OK;
- int oldstate = k->keepon & (KEEP_RECV_PAUSE| KEEP_SEND_PAUSE);
+ int oldstate;
+ int newstate;
- /* first switch off both pause bits */
- int newstate = k->keepon &~ (KEEP_RECV_PAUSE| KEEP_SEND_PAUSE);
+ if(!GOOD_EASY_HANDLE(data) || !data->conn)
+ /* crazy input, don't continue */
+ return CURLE_BAD_FUNCTION_ARGUMENT;
+
+ k = &data->req;
+ oldstate = k->keepon & (KEEP_RECV_PAUSE| KEEP_SEND_PAUSE);
- /* set the new desired pause bits */
- newstate |= ((action & CURLPAUSE_RECV)?KEEP_RECV_PAUSE:0) |
+ /* first switch off both pause bits then set the new pause bits */
+ newstate = (k->keepon &~ (KEEP_RECV_PAUSE| KEEP_SEND_PAUSE)) |
+ ((action & CURLPAUSE_RECV)?KEEP_RECV_PAUSE:0) |
((action & CURLPAUSE_SEND)?KEEP_SEND_PAUSE:0);
if((newstate & (KEEP_RECV_PAUSE| KEEP_SEND_PAUSE)) == oldstate) {