config: use git_config_parse_key() in git_config_parse_parameter()

The parsing of one-shot assignments of configuration variables that
come from the command line historically was quite loose and allowed
anything to pass.  It also downcased everything in the variable name,
even a three-level <section>.<subsection>.<variable> name in which
the <subsection> part must be treated in a case sensitive manner.

Existing git_config_parse_key() helper is used to parse the variable
name that comes from the command line, i.e. "git config VAR VAL",
and handles these details correctly.  Replace the strbuf_tolower()
call in git_config_parse_parameter() with a call to it to correct
both issues.  git_config_parse_key() does a bit more things that are
not necessary for the purpose of this codepath (e.g. it allocates a
separate buffer to return the canonicalized variable name because it
takes a "const char *" input), but we are not in a performance-critical
codepath here.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Junio C Hamano
2017-02-23 15:04:40 -08:00
parent ee98df3fa4
commit 1274a155af
2 changed files with 71 additions and 5 deletions

View File

@ -295,7 +295,9 @@ int git_config_parse_parameter(const char *text,
config_fn_t fn, void *data)
{
const char *value;
char *canonical_name;
struct strbuf **pair;
int ret;
pair = strbuf_split_str(text, '=', 2);
if (!pair[0])
@ -313,13 +315,15 @@ int git_config_parse_parameter(const char *text,
strbuf_list_free(pair);
return error("bogus config parameter: %s", text);
}
strbuf_tolower(pair[0]);
if (fn(pair[0]->buf, value, data) < 0) {
strbuf_list_free(pair);
return -1;
if (git_config_parse_key(pair[0]->buf, &canonical_name, NULL)) {
ret = -1;
} else {
ret = (fn(canonical_name, value, data) < 0) ? -1 : 0;
free(canonical_name);
}
strbuf_list_free(pair);
return 0;
return ret;
}
int git_config_from_parameters(config_fn_t fn, void *data)