Commit 2d9f5b9f by Edward Thomson

Parse config headers with quoted quotes

Parse config headers that have the last quote on the
line quoted instead of walking off the end.
parent c5780abb
...@@ -792,6 +792,11 @@ static int parse_section_header_ext(diskfile_backend *cfg, const char *line, con ...@@ -792,6 +792,11 @@ static int parse_section_header_ext(diskfile_backend *cfg, const char *line, con
} }
switch (c) { switch (c) {
case 0:
set_parse_error(cfg, 0, "Unexpected end-of-line in section header");
git_buf_free(&buf);
return -1;
case '"': case '"':
++quote_marks; ++quote_marks;
continue; continue;
...@@ -801,6 +806,12 @@ static int parse_section_header_ext(diskfile_backend *cfg, const char *line, con ...@@ -801,6 +806,12 @@ static int parse_section_header_ext(diskfile_backend *cfg, const char *line, con
switch (c) { switch (c) {
case '"': case '"':
if (&line[rpos-1] == last_quote) {
set_parse_error(cfg, 0, "Missing closing quotation mark in section header");
git_buf_free(&buf);
return -1;
}
case '\\': case '\\':
break; break;
......
...@@ -431,10 +431,10 @@ void test_config_read__simple_read_from_specific_level(void) ...@@ -431,10 +431,10 @@ void test_config_read__simple_read_from_specific_level(void)
git_config_free(cfg); git_config_free(cfg);
} }
static void clean_empty_config(void *unused) static void clean_test_config(void *unused)
{ {
GIT_UNUSED(unused); GIT_UNUSED(unused);
cl_fixture_cleanup("./empty"); cl_fixture_cleanup("./testconfig");
} }
void test_config_read__can_load_and_parse_an_empty_config_file(void) void test_config_read__can_load_and_parse_an_empty_config_file(void)
...@@ -442,10 +442,21 @@ void test_config_read__can_load_and_parse_an_empty_config_file(void) ...@@ -442,10 +442,21 @@ void test_config_read__can_load_and_parse_an_empty_config_file(void)
git_config *cfg; git_config *cfg;
int i; int i;
cl_set_cleanup(&clean_empty_config, NULL); cl_set_cleanup(&clean_test_config, NULL);
cl_git_mkfile("./empty", ""); cl_git_mkfile("./testconfig", "");
cl_git_pass(git_config_open_ondisk(&cfg, "./empty")); cl_git_pass(git_config_open_ondisk(&cfg, "./testconfig"));
cl_assert_equal_i(GIT_ENOTFOUND, git_config_get_int32(&i, cfg, "nope.neither")); cl_assert_equal_i(GIT_ENOTFOUND, git_config_get_int32(&i, cfg, "nope.neither"));
git_config_free(cfg); git_config_free(cfg);
} }
void test_config_read__corrupt_header(void)
{
git_config *cfg;
cl_set_cleanup(&clean_test_config, NULL);
cl_git_mkfile("./testconfig", "[sneaky ] \"quoted closing quote mark\\\"");
cl_git_fail(git_config_open_ondisk(&cfg, "./testconfig"));
git_config_free(cfg);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment