[PATCH] config: really treat missing optional path as not configured
From: Junio C Hamano <hidden>
Date: 2025-11-20 19:45:37
Subsystem:
the rest · Maintainer:
Linus Torvalds
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 <redacted> --- 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