]> git.proxmox.com Git - libgit2.git/commitdiff
config: allow empty string as value
authorNikolai Vladimirov <nikolay@vladimiroff.com>
Thu, 8 Aug 2013 18:17:32 +0000 (21:17 +0300)
committerNikolai Vladimirov <nikolay@vladimiroff.com>
Thu, 8 Aug 2013 19:25:25 +0000 (22:25 +0300)
`git_config_set_string(config, "config.section", "")` fails when
escaping the value.

The buffer in `escape_value` is allocated without NULL-termination. And
in case of empty string 0 is passed for buffer size in `git_buf_grow`.

`git_buf_detach` returns NULL when the allocated size is 0 and that
leads to an error return in `GITERR_CHECK_ALLOC` called after
`escape_value`

The change in `config_file.c` was suggested by Russell Belfer <rb@github.com>

src/config_file.c
tests-clar/config/write.c

index 2b0732a13ed58e6cbefe27f10018172eee3ca305..605e2e99ce7ac9594927cd81df40b0e434052809 100644 (file)
@@ -1293,6 +1293,9 @@ static char *escape_value(const char *ptr)
        assert(ptr);
 
        len = strlen(ptr);
+       if (!len)
+               return git__calloc(1, sizeof(char));
+
        git_buf_grow(&buf, len);
 
        while (*ptr != '\0') {
index d70612a970704534e09456876c65ec947831d23e..57b02a7d9756b5f62b76033f2ee0206c3dc37f6e 100644 (file)
@@ -242,3 +242,20 @@ void test_config_write__can_set_a_value_to_NULL(void)
 
     cl_git_sandbox_cleanup();
 }
+
+void test_config_write__can_set_an_empty_value(void)
+{
+       git_repository *repository;
+       git_config *config;
+       const char * str;
+
+       repository = cl_git_sandbox_init("testrepo.git");
+       cl_git_pass(git_repository_config(&config, repository));
+
+       cl_git_pass(git_config_set_string(config, "core.somevar", ""));
+       cl_git_pass(git_config_get_string(&str, config, "core.somevar"));
+       cl_assert_equal_s(str, "");
+
+       git_config_free(config);
+       cl_git_sandbox_cleanup();
+}