diff options
| author | Adam Johnson <me@adamj.eu> | 2025-04-29 10:33:52 +0100 |
|---|---|---|
| committer | Thomas Otto <th1000s@posteo.net> | 2025-05-02 17:41:03 +0200 |
| commit | cb610ec4c9cce5e82729f28e44f61197ab4c7132 (patch) | |
| tree | 4185087330c01db48a991f4685b5ad787d9883e7 | |
| parent | 42da5adab68c46277e20757f7a1f3b68eb874b0e (diff) | |
Fix index out of bounds crash for '@@ @@' hunk header
| -rw-r--r-- | src/handlers/hunk_header.rs | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/src/handlers/hunk_header.rs b/src/handlers/hunk_header.rs index 34f6d86..9ad2cb3 100644 --- a/src/handlers/hunk_header.rs +++ b/src/handlers/hunk_header.rs @@ -235,7 +235,7 @@ lazy_static! { fn parse_hunk_header(line: &str) -> Option<ParsedHunkHeader> { if let Some(caps) = HUNK_HEADER_REGEX.captures(line) { let file_coordinates = &caps[1]; - let line_numbers_and_hunk_lengths = HUNK_HEADER_FILE_COORDINATE_REGEX + let line_numbers_and_hunk_lengths: Vec<(usize, usize)> = HUNK_HEADER_FILE_COORDINATE_REGEX .captures_iter(file_coordinates) .map(|caps| { ( @@ -249,11 +249,15 @@ fn parse_hunk_header(line: &str) -> Option<ParsedHunkHeader> { ) }) .collect(); - let code_fragment = caps[2].to_string(); - Some(ParsedHunkHeader { - code_fragment, - line_numbers_and_hunk_lengths, - }) + if line_numbers_and_hunk_lengths.is_empty() { + None + } else { + let code_fragment = caps[2].to_string(); + Some(ParsedHunkHeader { + code_fragment, + line_numbers_and_hunk_lengths, + }) + } } else { None } @@ -457,6 +461,12 @@ pub mod tests { } #[test] + fn test_parse_hunk_header_with_no_hunk_lengths() { + let result = parse_hunk_header("@@ @@\n"); + assert_eq!(result, None); + } + + #[test] fn test_parse_hunk_header_added_file() { let ParsedHunkHeader { code_fragment, |
