зеркало из https://github.com/microsoft/git.git
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>
This commit is contained in:
Родитель
93b980e58f
Коммит
4d17fd253f
18
http.c
18
http.c
|
@ -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)
|
|||
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)
|
|||
#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,
|
|||
|
||||
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;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче