diff options
author | Patrick Steinhardt <ps@pks.im> | 2016-11-11 11:37:00 +0100 |
---|---|---|
committer | Patrick Steinhardt <ps@pks.im> | 2016-11-15 09:12:40 +0100 |
commit | 5cbd52607c7488d7b9680e743887b08926a24710 (patch) | |
tree | 9d8665046f7d5b092fb3aea64a21108da8e7f518 | |
parent | b7822050c99b8ea198d96e98cb720aa24a8230d0 (diff) | |
download | libgit2-5cbd52607c7488d7b9680e743887b08926a24710.tar.gz |
curl_stream: use CURLINFO_ACTIVESOCKET if curl is recent enough
The `CURLINFO_LASTSOCKET` information has been deprecated since
curl version 7.45.0 as it may result in an overflow in the
returned socket on certain systems, most importantly on 64 bit
Windows. Instead, a new call `CURLINFO_ACTIVESOCKET` has been
added which instead returns a `curl_socket_t`, which is always
sufficiently long to store a socket.
As we need to provide backwards compatibility with curl versions
smaller than 7.45.0, alias CURLINFO_ACTIVESOCKET to
CURLINFO_LASTSOCKET on platforms without CURLINFO_ACTIVESOCKET.
-rw-r--r-- | src/curl_stream.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/src/curl_stream.c b/src/curl_stream.c index 3a3f364b2..4e0455cca 100644 --- a/src/curl_stream.c +++ b/src/curl_stream.c @@ -15,6 +15,16 @@ #include "vector.h" #include "proxy.h" +/* This is for backwards compatibility with curl<7.45.0. */ +#ifndef CURLINFO_ACTIVESOCKET +# define CURLINFO_ACTIVESOCKET CURLINFO_LASTSOCKET +# define GIT_CURL_BADSOCKET -1 +# define git_activesocket_t long +#else +# define GIT_CURL_BADSOCKET CURL_SOCKET_BAD +# define git_activesocket_t curl_socket_t +#endif + typedef struct { git_stream parent; CURL *handle; @@ -87,7 +97,8 @@ static int ask_and_apply_proxy_creds(curl_stream *s) static int curls_connect(git_stream *stream) { curl_stream *s = (curl_stream *) stream; - long sockextr, connect_last = 0; + git_activesocket_t sockextr; + long connect_last = 0; int failed_cert = 0, error; bool retry_connect; CURLcode res; @@ -117,11 +128,11 @@ static int curls_connect(git_stream *stream) if (res == CURLE_PEER_FAILED_VERIFICATION) failed_cert = 1; - if ((res = curl_easy_getinfo(s->handle, CURLINFO_LASTSOCKET, &sockextr)) != CURLE_OK) { + if ((res = curl_easy_getinfo(s->handle, CURLINFO_ACTIVESOCKET, &sockextr)) != CURLE_OK) { return seterr_curl(s); } - if (sockextr == -1) { + if (sockextr == GIT_CURL_BADSOCKET) { giterr_set(GITERR_NET, "curl socket is no longer valid"); return -1; } |