diff --git a/CHANGES b/CHANGES index 2dff16a7e..80e357259 100644 --- a/CHANGES +++ b/CHANGES @@ -7,6 +7,11 @@ Changelog Daniel Stenberg (2 Feb 2009) +- Patrick Scott found a rather large memory leak when using the multi + interface and setting CURLMOPT_MAXCONNECTS to something less than the number + of handles you add to the multi handle. All the connections that didn't fit + in the cache would not be properly disconnected nor freed! + - Craig A West brought us: libcurl now defaults to do CONNECT with HTTP version 1.1 instead of 1.0 like before. This change also introduces the new proxy type for libcurl called 'CURLPROXY_HTTP_1_0' that then allows apps to diff --git a/RELEASE-NOTES b/RELEASE-NOTES index 9cd40916f..550a68c59 100644 --- a/RELEASE-NOTES +++ b/RELEASE-NOTES @@ -25,6 +25,7 @@ This release includes the following bugfixes: o FTP ;type=i URLs now work with CURLOPT_PROXY_TRANSFER_MODE in Turkish locale o realms with quoted quotation marks in HTTP Digest headers o VC9 makefiles are now really included + o multi interface memory leak with CURLMOPT_MAXCONNECTS set This release includes the following known bugs: @@ -34,6 +35,7 @@ This release would not have looked like this without help, code, reports and advice from friends like these: Lisa Xu, Daniel Fandrich, Craig A West, Alexey Borzov, Sharad Gupta, - Peter Sylvester, Chad Monroe, Markus Moeller, Yang Tse, Scott Cantor + Peter Sylvester, Chad Monroe, Markus Moeller, Yang Tse, Scott Cantor, + Patrick Scott Thanks! (and sorry if I forgot to mention someone) diff --git a/lib/url.c b/lib/url.c index 7cbe3cec0..80d55bd55 100644 --- a/lib/url.c +++ b/lib/url.c @@ -4804,8 +4804,12 @@ CURLcode Curl_done(struct connectdata **connp, state it is for re-using, so we're forced to close it. In a perfect world we can add code that keep track of if we really must close it here or not, but currently we have no such detail knowledge. + + connectindex == -1 here means that the connection has no spot in the + connection cache and thus we must disconnect it here. */ - if(data->set.reuse_forbid || conn->bits.close || premature) { + if(data->set.reuse_forbid || conn->bits.close || premature || + (-1 == conn->connectindex)) { CURLcode res2 = Curl_disconnect(conn); /* close the connection */ /* If we had an error already, make sure we return that one. But