config: fix several access(NULL) calls
authorMatthieu Moy <Matthieu.Moy@imag.fr>
Thu, 12 Jul 2012 12:04:20 +0000 (14:04 +0200)
committerJunio C Hamano <gitster@pobox.com>
Mon, 16 Jul 2012 16:59:06 +0000 (09:59 -0700)
When $HOME is unset, home_config_paths fails and returns NULL pointers
for user_config and xdg_config. Valgrind complains with Syscall param
access(pathname) points to unaddressable byte(s).

Don't call blindly access() on these variables, but test them for
NULL-ness before.

Signed-off-by: Matthieu Moy <Matthieu.Moy@imag.fr>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/config.c
config.c

index e8e1c0a4567f190c4b5d939bf9b0d363765bfd30..8cd08da99122bc79025d2a78204d316f1b7ba478 100644 (file)
@@ -387,12 +387,20 @@ int cmd_config(int argc, const char **argv, const char *prefix)
 
                home_config_paths(&user_config, &xdg_config, "config");
 
-               if (access(user_config, R_OK) && !access(xdg_config, R_OK))
+               if (!user_config)
+                       /*
+                        * It is unknown if HOME/.gitconfig exists, so
+                        * we do not know if we should write to XDG
+                        * location; error out even if XDG_CONFIG_HOME
+                        * is set and points at a sane location.
+                        */
+                       die("$HOME not set");
+
+               if (access(user_config, R_OK) &&
+                   xdg_config && !access(xdg_config, R_OK))
                        given_config_file = xdg_config;
-               else if (user_config)
-                       given_config_file = user_config;
                else
-                       die("$HOME not set");
+                       given_config_file = user_config;
        }
        else if (use_system_config)
                given_config_file = git_etc_gitconfig();
index d28a499b0b66b9e96317ea8eba24b59fc2cf5d49..6b97503b06c2e8284590e11acee3efbfa3f5f089 100644 (file)
--- a/config.c
+++ b/config.c
@@ -940,12 +940,12 @@ int git_config_early(config_fn_t fn, void *data, const char *repo_config)
                found += 1;
        }
 
-       if (!access(xdg_config, R_OK)) {
+       if (xdg_config && !access(xdg_config, R_OK)) {
                ret += git_config_from_file(fn, xdg_config, data);
                found += 1;
        }
 
-       if (!access(user_config, R_OK)) {
+       if (user_config && !access(user_config, R_OK)) {
                ret += git_config_from_file(fn, user_config, data);
                found += 1;
        }