[PATCH] config: really treat missing optional path as not configured
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Nov 20, 2025, 19:45 UTC
- Message-ID
- <xmqqikf47ajk.fsf@gitster.g>
- In-Reply-To
- <xmqqms4g7b1h.fsf@gitster.g>
These callers expect that git_config_pathname() that returns 0 is a signal that the variable they passed has a string they need to act on. But with the introduction of ":(optional)path" earlier, that is no longer the case. If the path specified by the configuration variable is missing, their variable will get a NULL in it, and they need to act on it (often, just refraining from copying it elsewhere).
Signed-off-by: Junio C Hamano <gitster@pobox.com> --- builtin/blame.c | 3 ++- builtin/receive-pack.c | 5 +++-- fetch-pack.c | 5 +++-- fsck.c | 12 +++++++----- gpg-interface.c | 10 +++++++++- setup.c | 2 +- 6 files changed, 25 insertions(+), 12 deletions(-)
diff --git a/builtin/blame.c b/builtin/blame.c index 2703820258..c39c1d3149 100644 --- a/builtin/blame.c +++ b/builtin/blame.c @@ -739,7 +739,8 @@ static int git_blame_config(const char *var, const char *value, ret = git_config_pathname(&str, var, value); if (ret) return ret; - string_list_insert(&ignore_revs_file_list, str); + if (str) + string_list_insert(&ignore_revs_file_list, str); free(str); return 0; } diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c index c9288a9c7e..c6e8e8346e 100644 --- a/builtin/receive-pack.c +++ b/builtin/receive-pack.c @@ -177,8 +177,9 @@ static int receive_pack_config(const char *var, const char *value, if (git_config_pathname(&path, var, value)) return -1; - strbuf_addf(&fsck_msg_types, "%cskiplist=%s", - fsck_msg_types.len ? ',' : '=', path); + if (path) + strbuf_addf(&fsck_msg_types, "%cskiplist=%s", + fsck_msg_types.len ? ',' : '=', path); free(path); return 0; } diff --git a/fetch-pack.c b/fetch-pack.c index fe7a84bf2f..7162fd3ba2 100644 --- a/fetch-pack.c +++ b/fetch-pack.c @@ -1873,8 +1873,9 @@ int fetch_pack_fsck_config(const char *var, const char *value, if (git_config_pathname(&path, var, value)) return -1; - strbuf_addf(msg_types, "%cskiplist=%s", - msg_types->len ? ',' : '=', path); + if (path) + strbuf_addf(msg_types, "%cskiplist=%s", + msg_types->len ? ',' : '=', path); free(path); return 0; } diff --git a/fsck.c b/fsck.c index 341e100d24..cf6f7f3a61 100644 --- a/fsck.c +++ b/fsck.c @@ -1369,14 +1369,16 @@ int git_fsck_config(const char *var, const char *value, if (strcmp(var, "fsck.skiplist") == 0) { char *path; - struct strbuf sb = STRBUF_INIT; if (git_config_pathname(&path, var, value)) return -1; - strbuf_addf(&sb, "skiplist=%s", path); - free(path); - fsck_set_msg_types(options, sb.buf); - strbuf_release(&sb); + if (path) { + struct strbuf sb = STRBUF_INIT; + strbuf_addf(&sb, "skiplist=%s", path); + free(path); + fsck_set_msg_types(options, sb.buf); + strbuf_release(&sb); + } return 0; } diff --git a/gpg-interface.c b/gpg-interface.c index f680ed38c0..3e73513694 100644 --- a/gpg-interface.c +++ b/gpg-interface.c @@ -794,8 +794,16 @@ static int git_gpg_config(const char *var, const char *value, fmtname = "ssh"; if (fmtname) { + char *program; + int status; + fmt = get_format_by_name(fmtname); - return git_config_pathname((char **) &fmt->program, var, value); + status = git_config_pathname(&program, var, value); + if (status) + return status; + if (program) + fmt->program = program; + return status; } return 0; diff --git a/setup.c b/setup.c index 7086741e6c..cf47441b7b 100644 --- a/setup.c +++ b/setup.c @@ -1248,7 +1248,7 @@ static int safe_directory_cb(const char *key, const char *value, } else { char *allowed = NULL; - if (!git_config_pathname(&allowed, key, value)) { + if (!git_config_pathname(&allowed, key, value) && allowed) { char *normalized = NULL; /*
-- 2.52.0-101-g4c43c53c49