diff options
| author | Daniel Stenberg <daniel@haxx.se> | 2006-12-05 15:36:26 +0000 | 
|---|---|---|
| committer | Daniel Stenberg <daniel@haxx.se> | 2006-12-05 15:36:26 +0000 | 
| commit | e4505aefd9dc81eb2c51f2739f8dc626f7c3ce93 (patch) | |
| tree | 91fe6560ef464cff67bedbc1ca69c77d5bb08877 /lib | |
| parent | d6b06128829d41c5e346bff424e48ddce0b7e990 (diff) | |
Jared Lundell filed bug report #1604956
(http://curl.haxx.se/bug/view.cgi?id=1604956) which identified setting
CURLOPT_MAXCONNECTS to zero caused libcurl to SIGSEGV. Starting now, libcurl
will always internally use no less than 1 entry in the connection cache.
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/easy.c | 4 | ||||
| -rw-r--r-- | lib/multi.c | 2 | ||||
| -rw-r--r-- | lib/url.c | 20 | ||||
| -rw-r--r-- | lib/url.h | 2 | 
4 files changed, 22 insertions, 6 deletions
diff --git a/lib/easy.c b/lib/easy.c index 7436017c0..73e145213 100644 --- a/lib/easy.c +++ b/lib/easy.c @@ -471,7 +471,7 @@ CURLcode curl_easy_perform(CURL *curl)    if(!data->state.connc) {      /* oops, no connection cache, make one up */ -    data->state.connc = Curl_mk_connc(CONNCACHE_PRIVATE); +    data->state.connc = Curl_mk_connc(CONNCACHE_PRIVATE, -1);      if(!data->state.connc)        return CURLE_OUT_OF_MEMORY;    } @@ -561,7 +561,7 @@ CURL *curl_easy_duphandle(CURL *incurl)      if(data->state.used_interface == Curl_if_multi)        outcurl->state.connc = data->state.connc;      else -      outcurl->state.connc = Curl_mk_connc(CONNCACHE_PRIVATE); +      outcurl->state.connc = Curl_mk_connc(CONNCACHE_PRIVATE, -1);      if(!outcurl->state.connc)        break; diff --git a/lib/multi.c b/lib/multi.c index a7cc25562..0411cc908 100644 --- a/lib/multi.c +++ b/lib/multi.c @@ -347,7 +347,7 @@ CURLM *curl_multi_init(void)      return NULL;    } -  multi->connc = Curl_mk_connc(CONNCACHE_MULTI); +  multi->connc = Curl_mk_connc(CONNCACHE_MULTI, -1);    if(!multi->connc) {      Curl_hash_destroy(multi->hostcache);      free(multi); @@ -377,11 +377,13 @@ CURLcode Curl_close(struct SessionHandle *data)  }  /* create a connection cache of a private or multi type */ -struct conncache *Curl_mk_connc(int type) +struct conncache *Curl_mk_connc(int type, +                                int amount) /* set -1 to use default */  {    /* It is subject for debate how many default connections to have for a multi       connection cache... */ -  int default_amount = (type == CONNCACHE_PRIVATE)?5:10; +  int default_amount = amount == -1? +    ((type == CONNCACHE_PRIVATE)?5:10):amount;    struct conncache *c;    c= calloc(sizeof(struct conncache), 1); @@ -407,6 +409,20 @@ CURLcode Curl_ch_connc(struct SessionHandle *data,    long i;    struct connectdata **newptr; +  if(newamount < 1) +    newamount = 1; /* we better have at least one entry */ + +  if(!c) { +    /* we get a NULL pointer passed in as connection cache, which means that +       there is no cache created for this SessionHandle just yet, we create a +       brand new with the requested size. +    */ +    data->state.connc = Curl_mk_connc(CONNCACHE_PRIVATE, newamount); +    if(!data->state.connc) +      return CURLE_OUT_OF_MEMORY; +    return CURLE_OK; +  } +    if(newamount < c->num) {      /* Since this number is *decreased* from the existing number, we must         close the possibly open connections that live on the indexes that @@ -47,7 +47,7 @@ CURLcode Curl_protocol_doing(struct connectdata *conn, bool *done);  void Curl_safefree(void *ptr);  /* create a connection cache */ -struct conncache *Curl_mk_connc(int type); +struct conncache *Curl_mk_connc(int type, int amount);  /* free a connection cache */  void Curl_rm_connc(struct conncache *c);  /* Change number of entries of a connection cache */  | 
