Skip to content

Commit 02af2cc

Browse files
committed
squash! remote-curl: unbreak http.extraHeader with custom allocators
remote-curl: unbreak http.extraHeader with custom allocators In 93b980e (http: use xmalloc with cURL, 2019-08-15), we started to ask cURL to use `xmalloc()`, and if compiled with nedmalloc, that means implicitly a different allocator than the system one. Which means that all of cURL's allocations and releases now _need_ to use that allocator. However, the `http_options()` function used `slist_append()` to add any configured extra HTTP header(s) _before_ asking cURL to use `xmalloc()`, and `http_cleanup()` would release them _afterwards_, i.e. in the presence of custom allocators, cURL would attempt to use the wrong allocator to release the memory. A naïve attempt at fixing this would move the call to `curl_global_init()` _before_ the config is parsed (i.e. before that call to `slist_append()`). However, that does work, as we _also_ parse the config setting `http.sslbackend` and if found, call `curl_global_sslset()` which *must* be called before `curl_global_init()`, for details see: https://curl.haxx.se/libcurl/c/curl_global_sslset.html So let's instead make the config parsing entirely independent from cURL's data structures. Incidentally, this deletes two more lines than it introduces, which is nice. Signed-off-by: Johannes Schindelin <[email protected]>
1 parent ffb6f1c commit 02af2cc

File tree

1 file changed

+11
-13
lines changed

1 file changed

+11
-13
lines changed

http.c

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ static unsigned long empty_auth_useless =
150150

151151
static struct curl_slist *pragma_header;
152152
static struct curl_slist *no_pragma_header;
153-
static struct curl_slist *extra_http_headers;
153+
static struct string_list extra_http_headers = STRING_LIST_INIT_DUP;
154154

155155
static struct active_request_slot *active_queue_head;
156156

@@ -414,11 +414,9 @@ static int http_options(const char *var, const char *value, void *cb)
414414
if (!value) {
415415
return config_error_nonbool(var);
416416
} else if (!*value) {
417-
curl_slist_free_all(extra_http_headers);
418-
extra_http_headers = NULL;
417+
string_list_clear(&extra_http_headers, 0);
419418
} else {
420-
extra_http_headers =
421-
curl_slist_append(extra_http_headers, value);
419+
string_list_append(&extra_http_headers, value);
422420
}
423421
return 0;
424422
}
@@ -1064,9 +1062,6 @@ void http_init(struct remote *remote, const char *url, int proactive_auth)
10641062
char *normalized_url;
10651063
struct urlmatch_config config = { STRING_LIST_INIT_DUP };
10661064

1067-
if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK)
1068-
die("curl_global_init failed");
1069-
10701065
config.section = "http";
10711066
config.key = NULL;
10721067
config.collect_fn = http_options;
@@ -1107,6 +1102,9 @@ void http_init(struct remote *remote, const char *url, int proactive_auth)
11071102
}
11081103
#endif
11091104

1105+
if (curl_global_init(CURL_GLOBAL_ALL) != CURLE_OK)
1106+
die("curl_global_init failed");
1107+
11101108
http_proactive_auth = proactive_auth;
11111109

11121110
if (remote && remote->http_proxy)
@@ -1202,8 +1200,7 @@ void http_cleanup(void)
12021200
#endif
12031201
curl_global_cleanup();
12041202

1205-
curl_slist_free_all(extra_http_headers);
1206-
extra_http_headers = NULL;
1203+
string_list_clear(&extra_http_headers, 0);
12071204

12081205
curl_slist_free_all(pragma_header);
12091206
pragma_header = NULL;
@@ -1627,10 +1624,11 @@ int run_one_slot(struct active_request_slot *slot,
16271624

16281625
struct curl_slist *http_copy_default_headers(void)
16291626
{
1630-
struct curl_slist *headers = NULL, *h;
1627+
struct curl_slist *headers = NULL;
1628+
const struct string_list_item *item;
16311629

1632-
for (h = extra_http_headers; h; h = h->next)
1633-
headers = curl_slist_append(headers, h->data);
1630+
for_each_string_list_item(item, &extra_http_headers)
1631+
headers = curl_slist_append(headers, item->string);
16341632

16351633
return headers;
16361634
}

0 commit comments

Comments
 (0)