aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYang Tse <yangsita@gmail.com>2011-11-01 14:38:21 +0100
committerYang Tse <yangsita@gmail.com>2011-11-01 14:38:21 +0100
commitf7dfe2b87a3c79be41ab4e17764675f36dca3670 (patch)
tree642aec9ba0d49b33d608cbaa916e1ceb038233ce
parentaf425efe833b0b0fd6e8d85954d18bbe9c940401 (diff)
multi.c: OOM handling fix
-rw-r--r--lib/multi.c10
1 files changed, 8 insertions, 2 deletions
diff --git a/lib/multi.c b/lib/multi.c
index 63aac69fa..ae708510a 100644
--- a/lib/multi.c
+++ b/lib/multi.c
@@ -514,6 +514,9 @@ CURLMcode curl_multi_add_handle(CURLM *multi_handle,
prev->next = next;
else
multi->closure = next;
+ /* removed from closure list now, this might reuse an existing
+ existing connection but we don't know that at this point */
+ data->state.shared_conn = NULL;
/* No need to continue, handle can only be present once in the list */
break;
}
@@ -1788,7 +1791,7 @@ CURLMcode curl_multi_cleanup(CURLM *multi_handle)
able to close connections "properly" */
cl = multi->closure;
while(cl) {
- cl->easy_handle->state.shared_conn = NULL; /* no more shared */
+ cl->easy_handle->state.shared_conn = NULL; /* allow cleanup */
if(cl->easy_handle->state.closed)
/* close handle only if curl_easy_cleanup() already has been called
for this easy handle */
@@ -2708,12 +2711,15 @@ static void multi_connc_remove_handle(struct Curl_multi *multi,
/* out of memory - so much for graceful shutdown */
Curl_disconnect(conn, /* dead_connection */ FALSE);
multi->connc->connects[i] = NULL;
+ data->state.shared_conn = NULL;
}
}
- else
+ else {
/* disconect the easy handle from the connection since the connection
will now remain but this easy handle is going */
+ data->state.shared_conn = NULL;
conn->data = NULL;
+ }
}
}
}