diff --git a/fuzzing/fuzz-targets/fuzz_config.py b/fuzzing/fuzz-targets/fuzz_config.py index 0a06956c8..80ab7b08d 100644 --- a/fuzzing/fuzz-targets/fuzz_config.py +++ b/fuzzing/fuzz-targets/fuzz_config.py @@ -34,12 +34,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 diff --git a/git/config.py b/git/config.py index 3ce9b123f..de3508360 100644 --- a/git/config.py +++ b/git/config.py @@ -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 diff --git a/test/test_config.py b/test/test_config.py index 0911d0262..92997422d 100644 --- a/test/test_config.py +++ b/test/test_config.py @@ -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")