Code

Merge branch 'maint'
authorJunio C Hamano <gitster@pobox.com>
Sun, 9 Dec 2007 08:56:44 +0000 (00:56 -0800)
committerJunio C Hamano <gitster@pobox.com>
Sun, 9 Dec 2007 08:56:44 +0000 (00:56 -0800)
* maint:
  config.c:store_write_pair(): don't read the byte before a malloc'd buffer.

1  2 
config.c

diff --combined config.c
index ed96213c44265289c26d46edaaf740cebd0b4c86,914cfce855d83d8a3404f315fd537f2f46da9d41..15b3d07349b246d3a46721c5d84c65a2093d9ad3
+++ b/config.c
@@@ -6,7 -6,6 +6,7 @@@
   *
   */
  #include "cache.h"
 +#include "exec_cmd.h"
  
  #define MAXNAME (256)
  
@@@ -460,21 -459,6 +460,21 @@@ int git_config_from_file(config_fn_t fn
        return ret;
  }
  
 +const char *git_etc_gitconfig(void)
 +{
 +      static const char *system_wide;
 +      if (!system_wide) {
 +              system_wide = ETC_GITCONFIG;
 +              if (!is_absolute_path(system_wide)) {
 +                      /* interpret path relative to exec-dir */
 +                      const char *exec_path = git_exec_path();
 +                      system_wide = prefix_path(exec_path, strlen(exec_path),
 +                                              system_wide);
 +              }
 +      }
 +      return system_wide;
 +}
 +
  int git_config(config_fn_t fn)
  {
        int ret = 0;
         * config file otherwise. */
        filename = getenv(CONFIG_ENVIRONMENT);
        if (!filename) {
 -              if (!access(ETC_GITCONFIG, R_OK))
 -                      ret += git_config_from_file(fn, ETC_GITCONFIG);
 +              if (!access(git_etc_gitconfig(), R_OK))
 +                      ret += git_config_from_file(fn, git_etc_gitconfig());
                home = getenv("HOME");
                filename = getenv(CONFIG_LOCAL_ENVIRONMENT);
                if (!filename)
@@@ -646,13 -630,19 +646,19 @@@ static int store_write_pair(int fd, con
        int length = strlen(key+store.baselen+1);
        int quote = 0;
  
-       /* Check to see if the value needs to be quoted. */
+       /*
+        * Check to see if the value needs to be surrounded with a dq pair.
+        * Note that problematic characters are always backslash-quoted; this
+        * check is about not losing leading or trailing SP and strings that
+        * follow beginning-of-comment characters (i.e. ';' and '#') by the
+        * configuration parser.
+        */
        if (value[0] == ' ')
                quote = 1;
        for (i = 0; value[i]; i++)
                if (value[i] == ';' || value[i] == '#')
                        quote = 1;
-       if (value[i-1] == ' ')
+       if (i && value[i-1] == ' ')
                quote = 1;
  
        if (write_in_full(fd, "\t", 1) != 1 ||