curl-library
[PATCH] Add local IP address to the hash key for the connection cache.
From: Linus Nielsen Feltzing <linus_at_haxx.se>
Date: Fri, 8 Mar 2013 10:52:32 +0100
Date: Fri, 8 Mar 2013 10:52:32 +0100
--- lib/conncache.c | 41 ++++++++++++++++++++++++++++++++--------- 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/lib/conncache.c b/lib/conncache.c index 530cdc2..bc10bf1 100644 --- a/lib/conncache.c +++ b/lib/conncache.c @@ -47,6 +47,21 @@ static void free_bundle_hash_entry(void *freethis) Curl_bundle_destroy(b); } +/* Combine hostname and local IP address to create a keystring for hashing */ +static char *create_hash_key(struct connectdata *conn) +{ + size_t iplen = strlen(conn->local_ip); + size_t hostlen = strlen(conn->host.name); + char *key = malloc(hostlen + iplen + 1); + + if(!key) + return NULL; + + strcpy(key, conn->local_ip); + strcpy(key + iplen, conn->host.name); + return key; +} + struct conncache *Curl_conncache_init(void) { struct conncache *connc; @@ -76,23 +91,23 @@ void Curl_conncache_destroy(struct conncache *connc) } struct connectbundle *Curl_conncache_find_bundle(struct conncache *connc, - char *hostname) + char *key) { struct connectbundle *bundle = NULL; if(connc) - bundle = Curl_hash_pick(connc->hash, hostname, strlen(hostname)+1); + bundle = Curl_hash_pick(connc->hash, key, strlen(key)+1); return bundle; } static bool conncache_add_bundle(struct conncache *connc, - char *hostname, + char *key, struct connectbundle *bundle) { void *p; - p = Curl_hash_add(connc->hash, hostname, strlen(hostname)+1, bundle); + p = Curl_hash_add(connc->hash, key, strlen(key)+1, bundle); return p?TRUE:FALSE; } @@ -128,17 +143,23 @@ CURLcode Curl_conncache_add_conn(struct conncache *connc, struct connectbundle *bundle; struct connectbundle *new_bundle = NULL; struct SessionHandle *data = conn->data; + char *key; - bundle = Curl_conncache_find_bundle(data->state.conn_cache, - conn->host.name); + key = create_hash_key(conn); + if(!key) + return CURLE_OUT_OF_MEMORY; + + bundle = Curl_conncache_find_bundle(data->state.conn_cache, key); if(!bundle) { result = Curl_bundle_create(data, &new_bundle); - if(result != CURLE_OK) + if(result != CURLE_OK) { + Curl_safefree(key); return result; + } - if(!conncache_add_bundle(data->state.conn_cache, - conn->host.name, new_bundle)) { + if(!conncache_add_bundle(data->state.conn_cache, key, new_bundle)) { Curl_bundle_destroy(new_bundle); + Curl_safefree(key); return CURLE_OUT_OF_MEMORY; } bundle = new_bundle; @@ -148,11 +169,13 @@ CURLcode Curl_conncache_add_conn(struct conncache *connc, if(result != CURLE_OK) { if(new_bundle) conncache_remove_bundle(data->state.conn_cache, new_bundle); + Curl_safefree(key); return result; } connc->num_connections++; + Curl_safefree(key); return CURLE_OK; } -- 1.7.10.4 --------------070608000007010406010801 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline ------------------------------------------------------------------- List admin: http://cool.haxx.se/list/listinfo/curl-library Etiquette: http://curl.haxx.se/mail/etiquette.html --------------070608000007010406010801--Received on 2001-09-17