http: refactor code to clarify memory ownership

There are various variables assigned via `git_config_string()` and
`git_config_pathname()` which are never free'd. This bug is relatable
because the out parameter of those functions are a `const char **`, even
though memory ownership is transferred to the caller.

We're about to adapt the functions to instead use `char **`. Prepare the
code accordingly. Note that the `(const char **)` casts will go away
once we have adapted the functions.

Signed-off-by: Patrick Steinhardt <ps@pks.im>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Patrick Steinhardt
2024-05-27 13:46:10 +02:00
committed by Junio C Hamano
parent cc395d6b47
commit f962ffc392

62
http.c
View File

@ -39,8 +39,8 @@ char curl_errorstr[CURL_ERROR_SIZE];
static int curl_ssl_verify = -1; static int curl_ssl_verify = -1;
static int curl_ssl_try; static int curl_ssl_try;
static const char *curl_http_version = NULL; static const char *curl_http_version = NULL;
static const char *ssl_cert; static char *ssl_cert;
static const char *ssl_cert_type; static char *ssl_cert_type;
static const char *ssl_cipherlist; static const char *ssl_cipherlist;
static const char *ssl_version; static const char *ssl_version;
static struct { static struct {
@ -59,23 +59,23 @@ static struct {
{ "tlsv1.3", CURL_SSLVERSION_TLSv1_3 }, { "tlsv1.3", CURL_SSLVERSION_TLSv1_3 },
#endif #endif
}; };
static const char *ssl_key; static char *ssl_key;
static const char *ssl_key_type; static char *ssl_key_type;
static const char *ssl_capath; static char *ssl_capath;
static const char *curl_no_proxy; static char *curl_no_proxy;
#ifdef GIT_CURL_HAVE_CURLOPT_PINNEDPUBLICKEY #ifdef GIT_CURL_HAVE_CURLOPT_PINNEDPUBLICKEY
static const char *ssl_pinnedkey; static const char *ssl_pinnedkey;
#endif #endif
static const char *ssl_cainfo; static char *ssl_cainfo;
static long curl_low_speed_limit = -1; static long curl_low_speed_limit = -1;
static long curl_low_speed_time = -1; static long curl_low_speed_time = -1;
static int curl_ftp_no_epsv; static int curl_ftp_no_epsv;
static const char *curl_http_proxy; static char *curl_http_proxy;
static const char *http_proxy_authmethod; static char *http_proxy_authmethod;
static const char *http_proxy_ssl_cert; static char *http_proxy_ssl_cert;
static const char *http_proxy_ssl_key; static char *http_proxy_ssl_key;
static const char *http_proxy_ssl_ca_info; static char *http_proxy_ssl_ca_info;
static struct credential proxy_cert_auth = CREDENTIAL_INIT; static struct credential proxy_cert_auth = CREDENTIAL_INIT;
static int proxy_ssl_cert_password_required; static int proxy_ssl_cert_password_required;
@ -112,7 +112,7 @@ static const char *curl_cookie_file;
static int curl_save_cookies; static int curl_save_cookies;
struct credential http_auth = CREDENTIAL_INIT; struct credential http_auth = CREDENTIAL_INIT;
static int http_proactive_auth; static int http_proactive_auth;
static const char *user_agent; static char *user_agent;
static int curl_empty_auth = -1; static int curl_empty_auth = -1;
enum http_follow_config http_follow_config = HTTP_FOLLOW_INITIAL; enum http_follow_config http_follow_config = HTTP_FOLLOW_INITIAL;
@ -381,17 +381,17 @@ static int http_options(const char *var, const char *value,
if (!strcmp("http.sslversion", var)) if (!strcmp("http.sslversion", var))
return git_config_string(&ssl_version, var, value); return git_config_string(&ssl_version, var, value);
if (!strcmp("http.sslcert", var)) if (!strcmp("http.sslcert", var))
return git_config_pathname(&ssl_cert, var, value); return git_config_pathname((const char **)&ssl_cert, var, value);
if (!strcmp("http.sslcerttype", var)) if (!strcmp("http.sslcerttype", var))
return git_config_string(&ssl_cert_type, var, value); return git_config_string((const char **)&ssl_cert_type, var, value);
if (!strcmp("http.sslkey", var)) if (!strcmp("http.sslkey", var))
return git_config_pathname(&ssl_key, var, value); return git_config_pathname((const char **)&ssl_key, var, value);
if (!strcmp("http.sslkeytype", var)) if (!strcmp("http.sslkeytype", var))
return git_config_string(&ssl_key_type, var, value); return git_config_string((const char **)&ssl_key_type, var, value);
if (!strcmp("http.sslcapath", var)) if (!strcmp("http.sslcapath", var))
return git_config_pathname(&ssl_capath, var, value); return git_config_pathname((const char **)&ssl_capath, var, value);
if (!strcmp("http.sslcainfo", var)) if (!strcmp("http.sslcainfo", var))
return git_config_pathname(&ssl_cainfo, var, value); return git_config_pathname((const char **)&ssl_cainfo, var, value);
if (!strcmp("http.sslcertpasswordprotected", var)) { if (!strcmp("http.sslcertpasswordprotected", var)) {
ssl_cert_password_required = git_config_bool(var, value); ssl_cert_password_required = git_config_bool(var, value);
return 0; return 0;
@ -440,19 +440,19 @@ static int http_options(const char *var, const char *value,
return 0; return 0;
} }
if (!strcmp("http.proxy", var)) if (!strcmp("http.proxy", var))
return git_config_string(&curl_http_proxy, var, value); return git_config_string((const char **)&curl_http_proxy, var, value);
if (!strcmp("http.proxyauthmethod", var)) if (!strcmp("http.proxyauthmethod", var))
return git_config_string(&http_proxy_authmethod, var, value); return git_config_string((const char **)&http_proxy_authmethod, var, value);
if (!strcmp("http.proxysslcert", var)) if (!strcmp("http.proxysslcert", var))
return git_config_string(&http_proxy_ssl_cert, var, value); return git_config_string((const char **)&http_proxy_ssl_cert, var, value);
if (!strcmp("http.proxysslkey", var)) if (!strcmp("http.proxysslkey", var))
return git_config_string(&http_proxy_ssl_key, var, value); return git_config_string((const char **)&http_proxy_ssl_key, var, value);
if (!strcmp("http.proxysslcainfo", var)) if (!strcmp("http.proxysslcainfo", var))
return git_config_string(&http_proxy_ssl_ca_info, var, value); return git_config_string((const char **)&http_proxy_ssl_ca_info, var, value);
if (!strcmp("http.proxysslcertpasswordprotected", var)) { if (!strcmp("http.proxysslcertpasswordprotected", var)) {
proxy_ssl_cert_password_required = git_config_bool(var, value); proxy_ssl_cert_password_required = git_config_bool(var, value);
@ -476,7 +476,7 @@ static int http_options(const char *var, const char *value,
} }
if (!strcmp("http.useragent", var)) if (!strcmp("http.useragent", var))
return git_config_string(&user_agent, var, value); return git_config_string((const char **)&user_agent, var, value);
if (!strcmp("http.emptyauth", var)) { if (!strcmp("http.emptyauth", var)) {
if (value && !strcmp("auto", value)) if (value && !strcmp("auto", value))
@ -592,10 +592,10 @@ static void init_curl_http_auth(CURL *result)
} }
/* *var must be free-able */ /* *var must be free-able */
static void var_override(const char **var, char *value) static void var_override(char **var, char *value)
{ {
if (value) { if (value) {
free((void *)*var); free(*var);
*var = xstrdup(value); *var = xstrdup(value);
} }
} }
@ -1233,11 +1233,13 @@ static CURL *get_curl_handle(void)
return result; return result;
} }
static void set_from_env(const char **var, const char *envname) static void set_from_env(char **var, const char *envname)
{ {
const char *val = getenv(envname); const char *val = getenv(envname);
if (val) if (val) {
*var = val; FREE_AND_NULL(*var);
*var = xstrdup(val);
}
} }
void http_init(struct remote *remote, const char *url, int proactive_auth) void http_init(struct remote *remote, const char *url, int proactive_auth)