Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/libgit2.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSven Strickroth <email@cs-ware.de>2013-11-07 16:17:36 +0400
committerSven Strickroth <email@cs-ware.de>2013-11-07 16:31:25 +0400
commitfde93250320f97cd6cf93be1e4ab09fd330e001f (patch)
treef17e1601ea7847a8cb33685c973354c8a5eca1a8 /src/config_file.c
parentb47949254ee5b7e5801fd3d1d80136bff5db938a (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.c26
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);
}
}