mirror of
https://github.com/moparisthebest/curl
synced 2024-12-21 23:58:49 -05:00
easy: fix connection ownership in curl_easy_pause
Before calling Curl_client_chop_write(), change the owner of connection to the current Curl_easy handle. This will fix the issue #2217. Fixes https://github.com/curl/curl/issues/2217 Closes https://github.com/curl/curl/pull/2221
This commit is contained in:
parent
89f6804734
commit
2a6dbb8155
15
lib/easy.c
15
lib/easy.c
@ -1045,6 +1045,8 @@ CURLcode curl_easy_pause(struct Curl_easy *data, int action)
|
|||||||
unsigned int i;
|
unsigned int i;
|
||||||
unsigned int count = data->state.tempcount;
|
unsigned int count = data->state.tempcount;
|
||||||
struct tempbuf writebuf[3]; /* there can only be three */
|
struct tempbuf writebuf[3]; /* there can only be three */
|
||||||
|
struct connectdata *conn = data->easy_conn;
|
||||||
|
struct Curl_easy *saved_data = NULL;
|
||||||
|
|
||||||
/* copy the structs to allow for immediate re-pausing */
|
/* copy the structs to allow for immediate re-pausing */
|
||||||
for(i = 0; i < data->state.tempcount; i++) {
|
for(i = 0; i < data->state.tempcount; i++) {
|
||||||
@ -1053,16 +1055,27 @@ CURLcode curl_easy_pause(struct Curl_easy *data, int action)
|
|||||||
}
|
}
|
||||||
data->state.tempcount = 0;
|
data->state.tempcount = 0;
|
||||||
|
|
||||||
|
/* set the connection's current owner */
|
||||||
|
if(conn->data != data) {
|
||||||
|
saved_data = conn->data;
|
||||||
|
conn->data = data;
|
||||||
|
}
|
||||||
|
|
||||||
for(i = 0; i < count; i++) {
|
for(i = 0; i < count; i++) {
|
||||||
/* even if one function returns error, this loops through and frees all
|
/* even if one function returns error, this loops through and frees all
|
||||||
buffers */
|
buffers */
|
||||||
if(!result)
|
if(!result)
|
||||||
result = Curl_client_chop_write(data->easy_conn,
|
result = Curl_client_chop_write(conn,
|
||||||
writebuf[i].type,
|
writebuf[i].type,
|
||||||
writebuf[i].buf,
|
writebuf[i].buf,
|
||||||
writebuf[i].len);
|
writebuf[i].len);
|
||||||
free(writebuf[i].buf);
|
free(writebuf[i].buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* recover previous owner of the connection */
|
||||||
|
if(saved_data)
|
||||||
|
conn->data = saved_data;
|
||||||
|
|
||||||
if(result)
|
if(result)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user