1
0
mirror of https://github.com/moparisthebest/curl synced 2024-12-21 07:38: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:
Basuke Suzuki 2018-01-05 15:39:07 -08:00 committed by Jay Satiro
parent 89f6804734
commit 2a6dbb8155

View File

@ -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;
} }