aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2006-12-05 15:36:26 +0000
committerDaniel Stenberg <daniel@haxx.se>2006-12-05 15:36:26 +0000
commite4505aefd9dc81eb2c51f2739f8dc626f7c3ce93 (patch)
tree91fe6560ef464cff67bedbc1ca69c77d5bb08877
parentd6b06128829d41c5e346bff424e48ddce0b7e990 (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.
-rw-r--r--CHANGES5
-rw-r--r--RELEASE-NOTES3
-rw-r--r--lib/easy.c4
-rw-r--r--lib/multi.c2
-rw-r--r--lib/url.c20
-rw-r--r--lib/url.h2
6 files changed, 29 insertions, 7 deletions
diff --git a/CHANGES b/CHANGES
index 6352a14d7..01a09bb4a 100644
--- a/CHANGES
+++ b/CHANGES
@@ -7,6 +7,11 @@
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.
diff --git a/RELEASE-NOTES b/RELEASE-NOTES
index ff47e8f38..4a5f34439 100644
--- a/RELEASE-NOTES
+++ b/RELEASE-NOTES
@@ -30,6 +30,7 @@ This release includes the following bugfixes:
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:
@@ -47,6 +48,6 @@ advice from friends like these:
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)
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);
diff --git a/lib/url.c b/lib/url.c
index 71463164a..4f9969dcf 100644
--- a/lib/url.c
+++ b/lib/url.c
@@ -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
diff --git a/lib/url.h b/lib/url.h
index 83706fd73..b92467350 100644
--- a/lib/url.h
+++ b/lib/url.h
@@ -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 */