Browse Source

remote-curl: unbreak http.extraHeader with custom allocators

In 93b980e58f (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 not 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 <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Johannes Schindelin 5 years ago committed by Junio C Hamano
parent
commit
4d17fd253f
  1. 18
      http.c

18
http.c

@ -150,7 +150,7 @@ static unsigned long empty_auth_useless = @@ -150,7 +150,7 @@ static unsigned long empty_auth_useless =

static struct curl_slist *pragma_header;
static struct curl_slist *no_pragma_header;
static struct curl_slist *extra_http_headers;
static struct string_list extra_http_headers = STRING_LIST_INIT_DUP;

static struct active_request_slot *active_queue_head;

@ -414,11 +414,9 @@ static int http_options(const char *var, const char *value, void *cb) @@ -414,11 +414,9 @@ static int http_options(const char *var, const char *value, void *cb)
if (!value) {
return config_error_nonbool(var);
} else if (!*value) {
curl_slist_free_all(extra_http_headers);
extra_http_headers = NULL;
string_list_clear(&extra_http_headers, 0);
} else {
extra_http_headers =
curl_slist_append(extra_http_headers, value);
string_list_append(&extra_http_headers, value);
}
return 0;
}
@ -1199,8 +1197,7 @@ void http_cleanup(void) @@ -1199,8 +1197,7 @@ void http_cleanup(void)
#endif
curl_global_cleanup();

curl_slist_free_all(extra_http_headers);
extra_http_headers = NULL;
string_list_clear(&extra_http_headers, 0);

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

struct curl_slist *http_copy_default_headers(void)
{
struct curl_slist *headers = NULL, *h;
struct curl_slist *headers = NULL;
const struct string_list_item *item;

for (h = extra_http_headers; h; h = h->next)
headers = curl_slist_append(headers, h->data);
for_each_string_list_item(item, &extra_http_headers)
headers = curl_slist_append(headers, item->string);

return headers;
}

Loading…
Cancel
Save