url: skip to-be-closed connections when pipelining

No longer attempt to use "doomed" to-be-closed connections when
pipelining. Prior to this change connections marked for deletion (e.g.
timeout) would be erroneously used, resulting in sporadic crashes.

As originally reported and fixed by Carlo Wood (origin unknown).

Bug: https://github.com/curl/curl/issues/627
Reported-by: Rider Linden

Closes https://github.com/curl/curl/pull/1075
Participation-by: nopjmp@users.noreply.github.com
This commit is contained in:
Rider Linden 2016-02-19 11:18:33 -08:00 коммит произвёл Jay Satiro
Родитель 1671d84b38
Коммит e5f0b1ab43
1 изменённых файлов: 3 добавлений и 1 удалений

Просмотреть файл

@ -2908,7 +2908,7 @@ static bool IsPipeliningPossible(const struct Curl_easy *handle,
const struct connectdata *conn)
{
/* If a HTTP protocol and pipelining is enabled */
if(conn->handler->protocol & PROTO_FAMILY_HTTP) {
if((conn->handler->protocol & PROTO_FAMILY_HTTP) && !conn->bits.close) {
if(Curl_pipeline_wanted(handle->multi, CURLPIPE_HTTP1) &&
(handle->set.httpversion != CURL_HTTP_VERSION_1_0) &&
@ -3283,6 +3283,8 @@ ConnectionExists(struct Curl_easy *data,
pipeLen = check->send_pipe->size + check->recv_pipe->size;
if(canPipeline) {
if(check->bits.close)
continue;
if(!check->bits.multiplex) {
/* If not multiplexing, make sure the pipe has only GET requests */