Commit e4505aef authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

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.
parent d6b06128
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -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.

+2 −1
Original line number Diff line number Diff line
@@ -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)
+2 −2
Original line number Diff line number Diff line
@@ -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;
+1 −1
Original line number Diff line number Diff line
@@ -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);
+18 −2
Original line number Diff line number Diff line
@@ -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
Loading