summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEdward Thomson <ethomson@github.com>2016-03-28 11:13:51 -0400
committerEdward Thomson <ethomson@github.com>2016-03-28 11:13:51 -0400
commite25e1ca1b24a2cb0f7c10f9ff6723283b06e4f22 (patch)
treef1dd7f3d6c3a0092aaa6aa3487bbec99551b53d0
parent3e95bd36d91cca0f3b1c209cc4f677125c02d442 (diff)
downloadlibgit2-e25e1ca1b24a2cb0f7c10f9ff6723283b06e4f22.tar.gz
config: don't write section header if we're in it
If we hit the EOF while trying to write a new value, it may be that we're already in the section that we were looking for. If so, do not write a (duplicate) section header, just write the value.
-rw-r--r--src/config_file.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/src/config_file.c b/src/config_file.c
index 584b9fa82..b2d21b00c 100644
--- a/src/config_file.c
+++ b/src/config_file.c
@@ -1500,7 +1500,7 @@ static int config_parse(
int (*on_section)(struct reader **reader, const char *current_section, const char *line, size_t line_len, void *data),
int (*on_variable)(struct reader **reader, const char *current_section, char *var_name, char *var_value, const char *line, size_t line_len, void *data),
int (*on_comment)(struct reader **reader, const char *line, size_t line_len, void *data),
- int (*on_eof)(struct reader **reader, void *data),
+ int (*on_eof)(struct reader **reader, const char *current_section, void *data),
void *data)
{
char *current_section = NULL, *var_name, *var_value, *line_start;
@@ -1551,7 +1551,7 @@ static int config_parse(
}
if (on_eof)
- result = on_eof(&reader, data);
+ result = on_eof(&reader, current_section, data);
git__free(current_section);
return result;
@@ -1867,7 +1867,8 @@ static int write_on_comment(struct reader **reader, const char *line, size_t lin
return write_line_to(&write_data->buffered_comment, line, line_len);
}
-static int write_on_eof(struct reader **reader, void *data)
+static int write_on_eof(
+ struct reader **reader, const char *current_section, void *data)
{
struct write_data *write_data = (struct write_data *)data;
int result = 0;
@@ -1886,7 +1887,11 @@ static int write_on_eof(struct reader **reader, void *data)
* value.
*/
if ((!write_data->preg || !write_data->preg_replaced) && write_data->value) {
- if ((result = write_section(write_data->buf, write_data->section)) == 0)
+ /* write the section header unless we're already in it */
+ if (!current_section || strcmp(current_section, write_data->section))
+ result = write_section(write_data->buf, write_data->section);
+
+ if (!result)
result = write_value(write_data);
}