Skip to content

Commit d49cb16

Browse files
peffgitster
authored andcommitted
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 <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 1b274c9 commit d49cb16

File tree

3 files changed

+21
-10
lines changed

3 files changed

+21
-10
lines changed

builtin/receive-pack.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ static enum deny_action parse_deny_action(const char *var, const char *value)
142142
static int receive_pack_config(const char *var, const char *value,
143143
const struct config_context *ctx, void *cb)
144144
{
145+
const char *msg_id;
145146
int status = parse_hide_refs_config(var, value, "receive", &hidden_refs);
146147

147148
if (status)
@@ -178,12 +179,14 @@ static int receive_pack_config(const char *var, const char *value,
178179
return 0;
179180
}
180181

181-
if (skip_prefix(var, "receive.fsck.", &var)) {
182-
if (is_valid_msg_type(var, value))
182+
if (skip_prefix(var, "receive.fsck.", &msg_id)) {
183+
if (!value)
184+
return config_error_nonbool(var);
185+
if (is_valid_msg_type(msg_id, value))
183186
strbuf_addf(&fsck_msg_types, "%c%s=%s",
184-
fsck_msg_types.len ? ',' : '=', var, value);
187+
fsck_msg_types.len ? ',' : '=', msg_id, value);
185188
else
186-
warning("skipping unknown msg id '%s'", var);
189+
warning("skipping unknown msg id '%s'", msg_id);
187190
return 0;
188191
}
189192

fetch-pack.c

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1862,6 +1862,8 @@ static struct ref *do_fetch_pack_v2(struct fetch_pack_args *args,
18621862
static int fetch_pack_config_cb(const char *var, const char *value,
18631863
const struct config_context *ctx, void *cb)
18641864
{
1865+
const char *msg_id;
1866+
18651867
if (strcmp(var, "fetch.fsck.skiplist") == 0) {
18661868
const char *path;
18671869

@@ -1873,12 +1875,14 @@ static int fetch_pack_config_cb(const char *var, const char *value,
18731875
return 0;
18741876
}
18751877

1876-
if (skip_prefix(var, "fetch.fsck.", &var)) {
1877-
if (is_valid_msg_type(var, value))
1878+
if (skip_prefix(var, "fetch.fsck.", &msg_id)) {
1879+
if (!value)
1880+
return config_error_nonbool(var);
1881+
if (is_valid_msg_type(msg_id, value))
18781882
strbuf_addf(&fsck_msg_types, "%c%s=%s",
1879-
fsck_msg_types.len ? ',' : '=', var, value);
1883+
fsck_msg_types.len ? ',' : '=', msg_id, value);
18801884
else
1881-
warning("Skipping unknown msg id '%s'", var);
1885+
warning("Skipping unknown msg id '%s'", msg_id);
18821886
return 0;
18831887
}
18841888

fsck.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1403,6 +1403,8 @@ int git_fsck_config(const char *var, const char *value,
14031403
const struct config_context *ctx, void *cb)
14041404
{
14051405
struct fsck_options *options = cb;
1406+
const char *msg_id;
1407+
14061408
if (strcmp(var, "fsck.skiplist") == 0) {
14071409
const char *path;
14081410
struct strbuf sb = STRBUF_INIT;
@@ -1416,8 +1418,10 @@ int git_fsck_config(const char *var, const char *value,
14161418
return 0;
14171419
}
14181420

1419-
if (skip_prefix(var, "fsck.", &var)) {
1420-
fsck_set_msg_type(options, var, value);
1421+
if (skip_prefix(var, "fsck.", &msg_id)) {
1422+
if (!value)
1423+
return config_error_nonbool(var);
1424+
fsck_set_msg_type(options, msg_id, value);
14211425
return 0;
14221426
}
14231427

0 commit comments

Comments
 (0)