Address out-of-bounds panic in inline completion button (#26394)

Cole Miller created

Closes #26350

Release Notes:

- Git Beta: Fixed a panic that could occur when using the project diff

Change summary

crates/multi_buffer/src/multi_buffer.rs       | 10 ++++++++--
crates/multi_buffer/src/multi_buffer_tests.rs | 11 +++++++++++
2 files changed, 19 insertions(+), 2 deletions(-)

Detailed changes

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(

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) {