diff options
author | Daniel Stenberg <daniel@haxx.se> | 2018-12-20 16:39:02 +0100 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2018-12-22 18:14:50 +0100 |
commit | fb445a1e18d12f577964c9347bc5bca74b37cd08 (patch) | |
tree | f4f9b2971a2c4b2d41f05bbf58508f8ae22100f7 /lib/conncache.c | |
parent | d18a5afaf07fdc093c6a6131cc7926a3d5a55407 (diff) |
disconnect: separate connections and easy handles better
Do not assume/store assocation between a given easy handle and the
connection if it can be avoided.
Long-term, the 'conn->data' pointer should probably be removed as it is a
little too error-prone. Still used very widely though.
Reported-by: masbug on github
Fixes #3391
Closes #3400
Diffstat (limited to 'lib/conncache.c')
-rw-r--r-- | lib/conncache.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/lib/conncache.c b/lib/conncache.c index 08e9042a6..080441854 100644 --- a/lib/conncache.c +++ b/lib/conncache.c @@ -302,9 +302,14 @@ CURLcode Curl_conncache_add_conn(struct conncache *connc, return result; } -void Curl_conncache_remove_conn(struct connectdata *conn, bool lock) +/* + * Removes the connectdata object from the connection cache *and* clears the + * ->data pointer association. Pass TRUE/FALSE in the 'lock' argument + * depending on if the parent function already holds the lock or not. + */ +void Curl_conncache_remove_conn(struct Curl_easy *data, + struct connectdata *conn, bool lock) { - struct Curl_easy *data = conn->data; struct connectbundle *bundle = conn->bundle; struct conncache *connc = data->state.conn_cache; @@ -323,6 +328,7 @@ void Curl_conncache_remove_conn(struct connectdata *conn, bool lock) DEBUGF(infof(data, "The cache now contains %zu members\n", connc->num_conn)); } + conn->data = NULL; /* clear the association */ if(lock) { CONN_UNLOCK(data); } |