diff options
author | Daniel Stenberg <daniel@haxx.se> | 2020-03-06 10:12:22 +0100 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2020-03-06 17:31:01 +0100 |
commit | e54b1885d19dee5ed04761295020a0a84b8296ca (patch) | |
tree | b862d580dc62eec4539ae9c6eb2ffd9c3b6c0f64 | |
parent | 3c3db98b6fce8d1c6481e300ed4918ccddbd7891 (diff) | |
download | curl-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.c | 18 |
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) { |