From 0df1e4a489f993e092c3e8134966066dc5b6944d Mon Sep 17 00:00:00 2001 From: Cole Miller Date: Tue, 11 Mar 2025 03:04:56 -0400 Subject: [PATCH] Address out-of-bounds panic in inline completion button (#26394) Closes #26350 Release Notes: - Git Beta: Fixed a panic that could occur when using the project diff --- crates/multi_buffer/src/multi_buffer.rs | 10 ++++++++-- crates/multi_buffer/src/multi_buffer_tests.rs | 11 +++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/crates/multi_buffer/src/multi_buffer.rs b/crates/multi_buffer/src/multi_buffer.rs index d9a00dcbed..1b1d691b53 100644 --- a/crates/multi_buffer/src/multi_buffer.rs +++ b/crates/multi_buffer/src/multi_buffer.rs @@ -4175,6 +4175,9 @@ impl MultiBufferSnapshot { let region = cursor.region()?; let overshoot = offset - region.range.start; let buffer_offset = region.buffer_range.start + overshoot; + if buffer_offset > region.buffer.len() { + return None; + } Some((region.buffer, buffer_offset)) } @@ -4183,8 +4186,11 @@ impl MultiBufferSnapshot { cursor.seek(&point); let region = cursor.region()?; let overshoot = point - region.range.start; - let buffer_offset = region.buffer_range.start + overshoot; - Some((region.buffer, buffer_offset, region.is_main_buffer)) + let buffer_point = region.buffer_range.start + overshoot; + if buffer_point > region.buffer.max_point() { + return None; + } + Some((region.buffer, buffer_point, region.is_main_buffer)) } pub fn suggested_indents( diff --git a/crates/multi_buffer/src/multi_buffer_tests.rs b/crates/multi_buffer/src/multi_buffer_tests.rs index 2a3d1727cd..8b10b787da 100644 --- a/crates/multi_buffer/src/multi_buffer_tests.rs +++ b/crates/multi_buffer/src/multi_buffer_tests.rs @@ -3378,6 +3378,17 @@ fn assert_position_translation(snapshot: &MultiBufferSnapshot) { } } } + + let point = snapshot.max_point(); + let Some((buffer, offset)) = snapshot.point_to_buffer_offset(point) else { + return; + }; + assert!(offset <= buffer.len(),); + + let Some((buffer, point, _)) = snapshot.point_to_buffer_point(point) else { + return; + }; + assert!(point <= buffer.max_point(),); } fn assert_line_indents(snapshot: &MultiBufferSnapshot) {