[PATCH v2] Work around curl-gnutls not liking to be reinitialized
- From
Mike Hommey <mh@glandium.org>
- Date
- Feb 8, 2008, 22:22 UTC
- Message-ID
- <1202509359-23840-1-git-send-email-mh@glandium.org>
- In-Reply-To
- <20080208220941.GA22199@glandium.org>
curl versions 7.16.3 to 7.18.0 included had a regression in which https requests following curl_global_cleanup/init sequence would fail with ASN1 parser errors with curl-gnutls. Such sequences happen in some cases such as git fetch.
We work around this by removing the http_cleanup call from get_refs_via_curl for broken versions of curl, and allowing http_init to be called several times without initializing http.c global variables again and leaking old values, which is a safe thing to have unconditionally.
The remaining calls to http_cleanup are either last (http-push.c), or almost never called (walker.c; the function it lies in is only called from transport-disconnect, which is called last, and only in builtin-push.c) These leaks shall be addressed in the http code refactoring.
Signed-off-by: Mike Hommey <mh@glandium.org> --- http.c | 5 +++++ transport.c | 2 ++ 2 files changed, 7 insertions(+), 0 deletions(-)
diff --git a/http.c b/http.c index d2c11ae..a3aa9e9 100644 --- a/http.c +++ b/http.c @@ -215,9 +215,14 @@ static CURL* get_curl_handle(void) void http_init(void) { + static int init = 0; char *low_speed_limit; char *low_speed_time; + if (init) + return; + init = 1; + curl_global_init(CURL_GLOBAL_ALL); pragma_header = curl_slist_append(pragma_header, "Pragma: no-cache"); diff --git a/transport.c b/transport.c index babaa21..32ab521 100644 --- a/transport.c +++ b/transport.c @@ -473,7 +473,9 @@ static struct ref *get_refs_via_curl(struct transport *transport) return NULL; } +#if (LIBCURL_VERSION_NUM < 0x071003) || (LIBCURL_VERSION_NUM > 0x071200) http_cleanup(); +#endif data = buffer.buf; start = NULL;
-- 1.5.4.7.gd8534-dirty