Skip to content

Commit ea747ed

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 5d4cc20 commit ea747ed

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
@@ -169,17 +169,26 @@ static curl_easy_setopt_pointer_type curl_easy_setopt_pointer_func;
169169
typedef CURLcode (*curl_easy_setopt_off_t_type)(CURL *curl, CURLoption opt, curl_off_t value);
170170
static curl_easy_setopt_off_t_type curl_easy_setopt_off_t_func;
171171

172+
static char ssl_backend[64];
173+
172174
static void lazy_load_curl(void)
173175
{
174176
static int initialized;
175-
void *libcurl;
177+
void *libcurl = NULL;
176178
func_t curl_easy_getinfo_func, curl_easy_setopt_func;
177179

178180
if (initialized)
179181
return;
180182

181183
initialized = 1;
182-
libcurl = load_library(LIBCURL_FILE_NAME("libcurl"));
184+
if (ssl_backend[0]) {
185+
char dll_name[64 + 16];
186+
snprintf(dll_name, sizeof(dll_name) - 1,
187+
LIBCURL_FILE_NAME("libcurl-%s"), ssl_backend);
188+
libcurl = load_library(dll_name);
189+
}
190+
if (!libcurl)
191+
libcurl = load_library(LIBCURL_FILE_NAME("libcurl"));
183192
if (!libcurl)
184193
die("failed to load library '%s'", LIBCURL_FILE_NAME("libcurl"));
185194

@@ -236,6 +245,9 @@ CURLcode curl_global_init(long flags)
236245

237246
CURLsslset curl_global_sslset(curl_sslbackend id, const char *name, const curl_ssl_backend ***avail)
238247
{
248+
if (name && strlen(name) < sizeof(ssl_backend))
249+
strlcpy(ssl_backend, name, sizeof(ssl_backend));
250+
239251
lazy_load_curl();
240252
return curl_global_sslset_func(id, name, avail);
241253
}

0 commit comments

Comments
 (0)