mirror of
https://github.com/git/git.git
synced 2024-05-19 00:06:12 +02:00
fsck: handle NULL value when parsing message config
When parsing fsck.*, receive.fsck.*, or fetch.fsck.*, we don't check for an implicit bool. So any of: [fsck] badTree [receive "fsck"] badTree [fetch "fsck"] badTree will cause us to segfault. We can fix it with config_error_nonbool() in the usual way, but we have to make a few more changes to get good error messages. The problem is that all three spots do: if (skip_prefix(var, "fsck.", &var)) to match and parse the actual message id. But that means that "var" now just says "badTree" instead of "receive.fsck.badTree", making the resulting message confusing. We can fix that by storing the parsed message id in its own separate variable. Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
1b274c9834
commit
d49cb162fa
|
@ -142,6 +142,7 @@ static enum deny_action parse_deny_action(const char *var, const char *value)
|
|||
static int receive_pack_config(const char *var, const char *value,
|
||||
const struct config_context *ctx, void *cb)
|
||||
{
|
||||
const char *msg_id;
|
||||
int status = parse_hide_refs_config(var, value, "receive", &hidden_refs);
|
||||
|
||||
if (status)
|
||||
|
@ -178,12 +179,14 @@ static int receive_pack_config(const char *var, const char *value,
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (skip_prefix(var, "receive.fsck.", &var)) {
|
||||
if (is_valid_msg_type(var, value))
|
||||
if (skip_prefix(var, "receive.fsck.", &msg_id)) {
|
||||
if (!value)
|
||||
return config_error_nonbool(var);
|
||||
if (is_valid_msg_type(msg_id, value))
|
||||
strbuf_addf(&fsck_msg_types, "%c%s=%s",
|
||||
fsck_msg_types.len ? ',' : '=', var, value);
|
||||
fsck_msg_types.len ? ',' : '=', msg_id, value);
|
||||
else
|
||||
warning("skipping unknown msg id '%s'", var);
|
||||
warning("skipping unknown msg id '%s'", msg_id);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
12
fetch-pack.c
12
fetch-pack.c
|
@ -1862,6 +1862,8 @@ static struct ref *do_fetch_pack_v2(struct fetch_pack_args *args,
|
|||
static int fetch_pack_config_cb(const char *var, const char *value,
|
||||
const struct config_context *ctx, void *cb)
|
||||
{
|
||||
const char *msg_id;
|
||||
|
||||
if (strcmp(var, "fetch.fsck.skiplist") == 0) {
|
||||
const char *path;
|
||||
|
||||
|
@ -1873,12 +1875,14 @@ static int fetch_pack_config_cb(const char *var, const char *value,
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (skip_prefix(var, "fetch.fsck.", &var)) {
|
||||
if (is_valid_msg_type(var, value))
|
||||
if (skip_prefix(var, "fetch.fsck.", &msg_id)) {
|
||||
if (!value)
|
||||
return config_error_nonbool(var);
|
||||
if (is_valid_msg_type(msg_id, value))
|
||||
strbuf_addf(&fsck_msg_types, "%c%s=%s",
|
||||
fsck_msg_types.len ? ',' : '=', var, value);
|
||||
fsck_msg_types.len ? ',' : '=', msg_id, value);
|
||||
else
|
||||
warning("Skipping unknown msg id '%s'", var);
|
||||
warning("Skipping unknown msg id '%s'", msg_id);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
8
fsck.c
8
fsck.c
|
@ -1403,6 +1403,8 @@ int git_fsck_config(const char *var, const char *value,
|
|||
const struct config_context *ctx, void *cb)
|
||||
{
|
||||
struct fsck_options *options = cb;
|
||||
const char *msg_id;
|
||||
|
||||
if (strcmp(var, "fsck.skiplist") == 0) {
|
||||
const char *path;
|
||||
struct strbuf sb = STRBUF_INIT;
|
||||
|
@ -1416,8 +1418,10 @@ int git_fsck_config(const char *var, const char *value,
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (skip_prefix(var, "fsck.", &var)) {
|
||||
fsck_set_msg_type(options, var, value);
|
||||
if (skip_prefix(var, "fsck.", &msg_id)) {
|
||||
if (!value)
|
||||
return config_error_nonbool(var);
|
||||
fsck_set_msg_type(options, msg_id, value);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue