diff options
author | Nikolai Vladimirov <nikolay@vladimiroff.com> | 2013-08-08 21:17:32 +0300 |
---|---|---|
committer | Nikolai Vladimirov <nikolay@vladimiroff.com> | 2013-08-08 22:25:25 +0300 |
commit | c57f668268744cbccb13c30095a0c1649fb18a63 (patch) | |
tree | 4cbe2a6d43db3577fcc0ea2ef10b8fcb687eb37b | |
parent | c5780abb024a3d570bc1e7eb8c892a60b77bad84 (diff) | |
download | libgit2-c57f668268744cbccb13c30095a0c1649fb18a63.tar.gz |
config: allow empty string as value
`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>
-rw-r--r-- | src/config_file.c | 3 | ||||
-rw-r--r-- | tests-clar/config/write.c | 17 |
2 files changed, 20 insertions, 0 deletions
diff --git a/src/config_file.c b/src/config_file.c index 2b0732a13..605e2e99c 100644 --- a/src/config_file.c +++ b/src/config_file.c @@ -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') { diff --git a/tests-clar/config/write.c b/tests-clar/config/write.c index d70612a97..57b02a7d9 100644 --- a/tests-clar/config/write.c +++ b/tests-clar/config/write.c @@ -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(); +} |