t1300: demonstrate failure when renaming sections with long lines
When renaming a configuration section which has an entry whose length
exceeds the size of our buffer in config.c's implementation of
`git_config_copy_or_rename_section_in_file()`, Git will incorrectly
form a new configuration section with part of the data in the section
being removed.
In this instance, our first configuration file looks something like:
[b]
c = d <spaces> [a] e = f
[a]
g = h
Here, we have two configuration values, "b.c", and "a.g". The value "[a]
e = f" belongs to the configuration value "b.c", and does not form its
own section.
However, when renaming the section 'a' to 'xyz', Git will write back
"[xyz]\ne = f", but "[xyz]" is still attached to the value of "b.c",
which is why "e = f" on its own line becomes a new entry called "b.e".
A slightly different example embeds the section being renamed within
another section.
Demonstrate this failure in a test in t1300, which we will fix in the
following commit.
Co-authored-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Helped-by: Jeff King <peff@peff.net>
Signed-off-by: Johannes Schindelin <Johannes.Schindelin@gmx.de>
Signed-off-by: Taylor Blau <me@ttaylorr.com>
This commit is contained in:
committed by
Johannes Schindelin
parent
2f3b28f272
commit
29198213c9
@ -613,6 +613,26 @@ test_expect_success 'renaming to bogus section is rejected' '
|
||||
test_must_fail git config --rename-section branch.zwei "bogus name"
|
||||
'
|
||||
|
||||
test_expect_failure 'renaming a section with a long line' '
|
||||
{
|
||||
printf "[b]\\n" &&
|
||||
printf " c = d %1024s [a] e = f\\n" " " &&
|
||||
printf "[a] g = h\\n"
|
||||
} >y &&
|
||||
git config -f y --rename-section a xyz &&
|
||||
test_must_fail git config -f y b.e
|
||||
'
|
||||
|
||||
test_expect_failure 'renaming an embedded section with a long line' '
|
||||
{
|
||||
printf "[b]\\n" &&
|
||||
printf " c = d %1024s [a] [foo] e = f\\n" " " &&
|
||||
printf "[a] g = h\\n"
|
||||
} >y &&
|
||||
git config -f y --rename-section a xyz &&
|
||||
test_must_fail git config -f y foo.e
|
||||
'
|
||||
|
||||
cat >> .git/config << EOF
|
||||
[branch "zwei"] a = 1 [branch "vier"]
|
||||
EOF
|
||||
|
||||
Reference in New Issue
Block a user