Changelog
Daniel (5 December 2006)
+- 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.
+
- Sh Diao reported that CURLOPT_FORBID_REUSE no works, and indeed it broke in
the 7.16.0 release.
o active FTP didn't work with multi interface
o curl_getdate() could be off one hour for TZ time zones with DST, on windows
o CURLOPT_FORBID_REUSE works again
+ o CURLOPT_MAXCONNECTS set to zero caused libcurl to SIGSEGV
Other curl-related news:
James Housley, Olaf Stueben, Yang Tse, Gisle Vanem, Bradford Bruce,
Ciprian Badescu, Dmitriy Sergeyev, Nir Soffer, Venkat Akella, Toon Verwaest,
- Matt Witherspoon, Alexey Simak, Martin Skinner, Sh Diao
+ Matt Witherspoon, Alexey Simak, Martin Skinner, Sh Diao, Jared Lundell
Thanks! (and sorry if I forgot to mention someone)
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;
}
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;
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);
}
/* 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);
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
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 */