From de0ef8af15945fb7f761503c615a2d6213d2fd82 Mon Sep 17 00:00:00 2001 From: Pascal Kuthe Date: Sun, 4 Jun 2023 17:20:04 +0200 Subject: [PATCH] fix UB in diff gutter (#7227) --- helix-vcs/src/diff/line_cache.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/helix-vcs/src/diff/line_cache.rs b/helix-vcs/src/diff/line_cache.rs index 8e48250f..460a2065 100644 --- a/helix-vcs/src/diff/line_cache.rs +++ b/helix-vcs/src/diff/line_cache.rs @@ -20,8 +20,8 @@ use super::{MAX_DIFF_BYTES, MAX_DIFF_LINES}; /// A cache that stores the `lines` of a rope as a vector. /// It allows safely reusing the allocation of the vec when updating the rope pub(crate) struct InternedRopeLines { - diff_base: Rope, - doc: Rope, + diff_base: Box, + doc: Box, num_tokens_diff_base: u32, interned: InternedInput>, } @@ -34,8 +34,8 @@ impl InternedRopeLines { after: Vec::with_capacity(doc.len_lines()), interner: Interner::new(diff_base.len_lines() + doc.len_lines()), }, - diff_base, - doc, + diff_base: Box::new(diff_base), + doc: Box::new(doc), // will be populated by update_diff_base_impl num_tokens_diff_base: 0, }; @@ -44,19 +44,19 @@ impl InternedRopeLines { } pub fn doc(&self) -> Rope { - self.doc.clone() + Rope::clone(&*self.doc) } pub fn diff_base(&self) -> Rope { - self.diff_base.clone() + Rope::clone(&*self.diff_base) } /// Updates the `diff_base` and optionally the document if `doc` is not None pub fn update_diff_base(&mut self, diff_base: Rope, doc: Option) { self.interned.clear(); - self.diff_base = diff_base; + self.diff_base = Box::new(diff_base); if let Some(doc) = doc { - self.doc = doc + self.doc = Box::new(doc) } if !self.is_too_large() { self.update_diff_base_impl(); @@ -74,7 +74,7 @@ impl InternedRopeLines { .interner .erase_tokens_after(self.num_tokens_diff_base.into()); - self.doc = doc; + self.doc = Box::new(doc); if self.is_too_large() { self.interned.after.clear(); } else {