git_config_set: fix off-by-two
authorJohannes Schindelin <johannes.schindelin@gmx.de>
Tue, 3 Apr 2018 16:28:00 +0000 (18:28 +0200)
committerJunio C Hamano <gitster@pobox.com>
Thu, 5 Apr 2018 23:30:03 +0000 (08:30 +0900)
Currently, we are slightly overzealous When removing an entry from a
config file of this form:

[abc]a
[xyz]
key = value

When calling `git config --unset abc.a` on this file, it leaves this
(invalid) config behind:

[
[xyz]
key = value

The reason is that we try to search for the beginning of the line (or
for the end of the preceding section header on the same line) that
defines abc.a, but as an optimization, we subtract 2 from the offset
pointing just after the definition before we call
find_beginning_of_line(). That function, however, *also* performs that
optimization and promptly fails to find the section header correctly.

Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
config.c
index e617c2018d22b6d389548a3573d2deb2ec608b99..4c8571ab33bd6572a6035d7f3408f77cdfeb8dbf 100644 (file)
--- a/config.c
+++ b/config.c
@@ -2624,7 +2624,7 @@ int git_config_set_multivar_in_file_gently(const char *config_filename,
                        } else
                                copy_end = find_beginning_of_line(
                                        contents, contents_sz,
-                                       store.offset[i]-2, &new_line);
+                                       store.offset[i], &new_line);
 
                        if (copy_end > 0 && contents[copy_end-1] != '\n')
                                new_line = 1;