]> granicus.if.org Git - curl/commitdiff
Jared Lundell filed bug report #1604956
authorDaniel Stenberg <daniel@haxx.se>
Tue, 5 Dec 2006 15:36:26 +0000 (15:36 +0000)
committerDaniel Stenberg <daniel@haxx.se>
Tue, 5 Dec 2006 15:36:26 +0000 (15:36 +0000)
(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.

CHANGES
RELEASE-NOTES
lib/easy.c
lib/multi.c
lib/url.c
lib/url.h

diff --git a/CHANGES b/CHANGES
index 6352a14d773df0860ff0982bcc97034b243a8e0d..01a09bb4a16681732b1fbfaa3c57b02cf54fe6ef 100644 (file)
--- 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.
 
index ff47e8f38f49d9128e2a95f4baaad831cf64db9f..4a5f344398ba370880c7d78b938893a6aba13e79 100644 (file)
@@ -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)
index 7436017c0188c9e9bc5ea858eab175ed8bf6c806..73e1452136a4cfa893d0712f8526c8fe31b8e38d 100644 (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;
index a7cc25562cd8a6d2205469626a6e363024860971..0411cc908c907cfc63cc1e0e9c1c8bc69e69caa4 100644 (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);
index 71463164adcea88259cd7685899c126d759a7918..4f9969dcfb3834ce28b68983314a6013cb18efa3 100644 (file)
--- 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
index 83706fd7390d650084bed89ea63e8efbd53741ea..b92467350e0fff65f3aeece9e655a8b661c2caa2 100644 (file)
--- 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 */