Skip to content

Commit

Permalink
Merge pull request #1908 from DaveLak/fix-issue-1887
Browse files Browse the repository at this point in the history
Fix `IndexError` in `GitConfigParser` When a Quoted Config Value Contains a Trailing New Line
  • Loading branch information
Byron authored Apr 26, 2024
2 parents fa2b2d6 + 1a0ab5b commit 82bb3bb
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 7 deletions.
8 changes: 2 additions & 6 deletions fuzzing/fuzz-targets/fuzz_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,12 +39,8 @@ def TestOneInput(data):
git_config.read()
except (MissingSectionHeaderError, ParsingError, UnicodeDecodeError):
return -1 # Reject inputs raising expected exceptions
except (IndexError, ValueError) as e:
if isinstance(e, IndexError) and "string index out of range" in str(e):
# Known possibility that might be patched
# See: https://github.com/gitpython-developers/GitPython/issues/1887
pass
elif isinstance(e, ValueError) and "embedded null byte" in str(e):
except ValueError as e:
if "embedded null byte" in str(e):
# The `os.path.expanduser` function, which does not accept strings
# containing null bytes might raise this.
return -1
Expand Down
2 changes: 1 addition & 1 deletion git/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -452,7 +452,7 @@ def _read(self, fp: Union[BufferedReader, IO[bytes]], fpname: str) -> None:
e = None # None, or an exception.

def string_decode(v: str) -> str:
if v[-1] == "\\":
if v and v.endswith("\\"):
v = v[:-1]
# END cut trailing escapes to prevent decode error

Expand Down
8 changes: 8 additions & 0 deletions test/test_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,14 @@ def test_multi_line_config(self):
)
self.assertEqual(len(config.sections()), 23)

def test_config_value_with_trailing_new_line(self):
config_content = b'[section-header]\nkey:"value\n"'
config_file = io.BytesIO(config_content)
config_file.name = "multiline_value.config"

git_config = GitConfigParser(config_file)
git_config.read() # This should not throw an exception

def test_base(self):
path_repo = fixture_path("git_config")
path_global = fixture_path("git_config_global")
Expand Down

0 comments on commit 82bb3bb

Please sign in to comment.