aboutsummaryrefslogtreecommitdiff
path: root/helix-core
diff options
context:
space:
mode:
authorMike Trinkala2024-03-07 19:37:01 +0000
committerGitHub2024-03-07 19:37:01 +0000
commite27b04735c630140b45ac9fab1b3087ae831f34a (patch)
tree6c7731feab53a6aff3abdeb7dca3b64d2cd37a1e /helix-core
parentcb01e52cd8b8021686ee98dd4d53dff8cdc826a9 (diff)
Fix panic in select_textobject_around (#9832)
Test Document ------------- ``` a)b ``` Steps to Reproduce ------------------ 1. % # select_all 1. ms( # surround_add 1. mam # select_textobject_around Debug and Release ----------------- `thread 'main' panicked at 'Attempt to index past end of RopeSlice: char index 7, RopeSlice char length 6', ropey-1.6.1/src/slice.rs:796:13` Description ----------- An index was selected beyond the end of the slice with chars_at. The fix adds a guard check to `find_nth_open_pair`, like in the other find_nth* functions.
Diffstat (limited to 'helix-core')
-rw-r--r--helix-core/src/surround.rs19
1 files changed, 19 insertions, 0 deletions
diff --git a/helix-core/src/surround.rs b/helix-core/src/surround.rs
index 513f8749..ed976488 100644
--- a/helix-core/src/surround.rs
+++ b/helix-core/src/surround.rs
@@ -167,6 +167,10 @@ fn find_nth_open_pair(
mut pos: usize,
n: usize,
) -> Option<usize> {
+ if pos >= text.len_chars() {
+ return None;
+ }
+
let mut chars = text.chars_at(pos + 1);
// Adjusts pos for the first iteration, and handles the case of the
@@ -383,6 +387,21 @@ mod test {
)
}
+ #[test]
+ fn test_find_nth_closest_pairs_pos_index_range_panic() {
+ #[rustfmt::skip]
+ let (doc, selection, _) =
+ rope_with_selections_and_expectations(
+ "(a)c)",
+ "^^^^^"
+ );
+
+ assert_eq!(
+ find_nth_closest_pairs_pos(doc.slice(..), selection.primary(), 1),
+ Err(Error::PairNotFound)
+ )
+ }
+
// Create a Rope and a matching Selection using a specification language.
// ^ is a single-point selection.
// _ is an expected index. These are returned as a Vec<usize> for use in assertions.