diff options
author | Sven Strickroth <email@cs-ware.de> | 2013-11-07 16:17:36 +0400 |
---|---|---|
committer | Sven Strickroth <email@cs-ware.de> | 2013-11-07 16:31:25 +0400 |
commit | fde93250320f97cd6cf93be1e4ab09fd330e001f (patch) | |
tree | f17e1601ea7847a8cb33685c973354c8a5eca1a8 /src/config_file.c | |
parent | b47949254ee5b7e5801fd3d1d80136bff5db938a (diff) |
Correctly quote config values while saving
If the value contains a command (; or #) char or starts or ends with space it needs to be quoted.
Signed-off-by: Sven Strickroth <email@cs-ware.de>
Diffstat (limited to 'src/config_file.c')
-rw-r--r-- | src/config_file.c | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/src/config_file.c b/src/config_file.c index c7fc32060..1e58e3a7a 100644 --- a/src/config_file.c +++ b/src/config_file.c @@ -1178,6 +1178,22 @@ static int write_section(git_filebuf *file, const char *key) return result; } +static int needsQuote(const char *value) +{ + const char *ptr = value; + if (*value == ' ') + return 1; + while (*ptr) { + if (*ptr == ';' || *ptr == '#') + return 1; + ++ptr; + } + if (ptr != value && *(--ptr) == ' ') + return 1; + + return 0; +} + /* * This is pretty much the parsing, except we write out anything we don't have */ @@ -1299,7 +1315,10 @@ static int config_write(diskfile_backend *cfg, const char *key, const regex_t *p /* Then replace the variable. If the value is NULL, it * means we want to delete it, so don't write anything. */ if (value != NULL) { - git_filebuf_printf(&file, "\t%s = %s\n", name, value); + if (needsQuote(value)) + git_filebuf_printf(&file, "\t%s = \"%s\"\n", name, value); + else + git_filebuf_printf(&file, "\t%s = %s\n", name, value); } /* @@ -1359,7 +1378,10 @@ static int config_write(diskfile_backend *cfg, const char *key, const regex_t *p if (reader->buffer.size > 0 && *(reader->buffer.ptr + reader->buffer.size - 1) != '\n') git_filebuf_write(&file, "\n", 1); - git_filebuf_printf(&file, "\t%s = %s\n", name, value); + if (needsQuote(value)) + git_filebuf_printf(&file, "\t%s = \"%s\"\n", name, value); + else + git_filebuf_printf(&file, "\t%s = %s\n", name, value); } } |