Skip to content

Commit 0a6fa31

Browse files
committed
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 <johannes.schindelin@gmx.de>
1 parent 3336704 commit 0a6fa31

File tree

1 file changed

+14
-2
lines changed

1 file changed

+14
-2
lines changed

Diff for: compat/lazyload-curl.c

+14-2
Original file line numberDiff line numberDiff line change
@@ -172,17 +172,26 @@ static curl_easy_setopt_pointer_type curl_easy_setopt_pointer_func;
172172
typedef CURLcode (*curl_easy_setopt_off_t_type)(CURL *curl, CURLoption opt, curl_off_t value);
173173
static curl_easy_setopt_off_t_type curl_easy_setopt_off_t_func;
174174

175+
static char ssl_backend[64];
176+
175177
static void lazy_load_curl(void)
176178
{
177179
static int initialized;
178-
void *libcurl;
180+
void *libcurl = NULL;
179181
func_t curl_easy_getinfo_func, curl_easy_setopt_func;
180182

181183
if (initialized)
182184
return;
183185

184186
initialized = 1;
185-
libcurl = load_library(LIBCURL_FILE_NAME("libcurl"));
187+
if (ssl_backend[0]) {
188+
char dll_name[64 + 16];
189+
snprintf(dll_name, sizeof(dll_name) - 1,
190+
LIBCURL_FILE_NAME("libcurl-%s"), ssl_backend);
191+
libcurl = load_library(dll_name);
192+
}
193+
if (!libcurl)
194+
libcurl = load_library(LIBCURL_FILE_NAME("libcurl"));
186195
if (!libcurl)
187196
die("failed to load library '%s'", LIBCURL_FILE_NAME("libcurl"));
188197

@@ -246,6 +255,9 @@ CURLcode curl_global_init(long flags)
246255

247256
CURLsslset curl_global_sslset(curl_sslbackend id, const char *name, const curl_ssl_backend ***avail)
248257
{
258+
if (name && strlen(name) < sizeof(ssl_backend))
259+
strlcpy(ssl_backend, name, sizeof(ssl_backend));
260+
249261
lazy_load_curl();
250262
return curl_global_sslset_func(id, name, avail);
251263
}

0 commit comments

Comments
 (0)