[PATCH] Work around curl-gnutls not liking to be reinitialized

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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 the 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@xxxxxxxxxxxx>
---
 > Don't you have to make this conditional on the CURL version as well?  I
 > mean, that cleanup:

 > > 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
 >
 > requires us to init again, no?

 Damn, you're right. But it would actually be better to just have the init
 variable set to 0 again in http_cleanup, and actually, we already have a
 global variable that is set in http_init and reset in http_cleanup that
 could be used for this test...

 http.c      |    3 +++
 transport.c |    2 ++
 2 files changed, 5 insertions(+), 0 deletions(-)

diff --git a/http.c b/http.c
index d2c11ae..d69ba90 100644
--- a/http.c
+++ b/http.c
@@ -218,6 +218,9 @@ void http_init(void)
 	char *low_speed_limit;
 	char *low_speed_time;
 
+	if (pragma_header)
+		return;
+
 	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.8.g95ac

-
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]

  Powered by Linux