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.
This commit is contained in:
Daniel Stenberg 2006-12-05 15:36:26 +00:00
parent d6b0612882
commit e4505aefd9
6 changed files with 29 additions and 7 deletions

View file

@ -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;

View file

@ -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);

View file

@ -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

View file

@ -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 */