Skip to content

Commit 5111027

Browse files
dschoGit for Windows Build Agent
authored andcommitted
http: when loading libcurl lazily, allow for multiple SSL backends
The previous commits introduced a compile-time option to load libcurl lazily, but it uses the hard-coded name "libcurl-4.dll" (or equivalent on platforms other than Windows). To allow for installing multiple libcurl flavors side by side, where each supports one specific SSL/TLS backend, let's first look whether `libcurl-<backend>-4.dll` exists, and only use `libcurl-4.dll` as a fall back. That will allow us to ship with a libcurl by default that only supports the Secure Channel backend for the `https://` protocol. This libcurl won't suffer from any dependency problem when upgrading OpenSSL to a new major version (which will change the DLL name, and hence break every program and library that depends on it). This is crucial because Git for Windows relies on libcurl to keep working when building and deploying a new OpenSSL package because that library is used by `git fetch` and `git clone`. Note that this feature is by no means specific to Windows. On Ubuntu, for example, a `git` built using `LAZY_LOAD_LIBCURL` will use `libcurl.so.4` for `http.sslbackend=openssl` and `libcurl-gnutls.so.4` for `http.sslbackend=gnutls`. Signed-off-by: Johannes Schindelin <[email protected]>
1 parent f4ea4cd commit 5111027

File tree

1 file changed

+14
-2
lines changed

1 file changed

+14
-2
lines changed

compat/lazyload-curl.c

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -153,17 +153,26 @@ static curl_easy_setopt_pointer_type curl_easy_setopt_pointer_func;
153153
typedef CURLcode (*curl_easy_setopt_off_t_type)(CURL *curl, CURLoption opt, curl_off_t value);
154154
static curl_easy_setopt_off_t_type curl_easy_setopt_off_t_func;
155155

156+
static char ssl_backend[64];
157+
156158
static void lazy_load_curl(void)
157159
{
158160
static int initialized;
159-
void *libcurl;
161+
void *libcurl = NULL;
160162
func_t curl_easy_getinfo_func, curl_easy_setopt_func;
161163

162164
if (initialized)
163165
return;
164166

165167
initialized = 1;
166-
libcurl = load_library(LIBCURL_FILE_NAME("libcurl"));
168+
if (ssl_backend[0]) {
169+
char dll_name[64 + 16];
170+
snprintf(dll_name, sizeof(dll_name) - 1,
171+
LIBCURL_FILE_NAME("libcurl-%s"), ssl_backend);
172+
libcurl = load_library(dll_name);
173+
}
174+
if (!libcurl)
175+
libcurl = load_library(LIBCURL_FILE_NAME("libcurl"));
167176
if (!libcurl)
168177
die("failed to load library '%s'", LIBCURL_FILE_NAME("libcurl"));
169178

@@ -220,6 +229,9 @@ CURLcode curl_global_init(long flags)
220229

221230
CURLsslset curl_global_sslset(curl_sslbackend id, const char *name, const curl_ssl_backend ***avail)
222231
{
232+
if (name && strlen(name) < sizeof(ssl_backend))
233+
strlcpy(ssl_backend, name, sizeof(ssl_backend));
234+
223235
lazy_load_curl();
224236
return curl_global_sslset_func(id, name, avail);
225237
}

0 commit comments

Comments
 (0)