about summary refs log tree commit diff
diff options
context:
space:
mode:
authorYureka <tvl@yuka.dev>2024-10-01T14·16+0200
committerclbot <clbot@tvl.fyi>2024-10-01T15·27+0000
commitab3555f5a7fa6347049159ee3a32730f9a0c637c (patch)
treeccaa0f3bec0feab2fdaaae8b7f9cabb9bfd23c37
parentf0d5ed7074097ca44a86865ef82cdbd1d1bddff7 (diff)
fix(tvix/castore/refscan): don't panic on empty patterns r/8747
Previously, the overlap calculation would underflow when
the pattern is empty.

Change-Id: I1f6bf49fafc4b8183a3a5e5e491a5a5bfc41ca97
Reviewed-on: https://cl.tvl.fyi/c/depot/+/12558
Reviewed-by: flokli <flokli@flokli.de>
Tested-by: BuildkiteCI
Autosubmit: yuka <yuka@yuka.dev>
-rw-r--r--tvix/castore/src/refscan.rs10
1 files changed, 9 insertions, 1 deletions
diff --git a/tvix/castore/src/refscan.rs b/tvix/castore/src/refscan.rs
index 0b8af296bb50..8e6a81b2a4fe 100644
--- a/tvix/castore/src/refscan.rs
+++ b/tvix/castore/src/refscan.rs
@@ -192,7 +192,15 @@ where
         self: Pin<&mut Self>,
         cx: &mut std::task::Context<'_>,
     ) -> Poll<std::io::Result<&[u8]>> {
-        let overlap = self.scanner.pattern.longest_candidate() - 1;
+        #[allow(clippy::manual_saturating_arithmetic)] // for clarity
+        let overlap = self
+            .scanner
+            .pattern
+            .longest_candidate()
+            .checked_sub(1)
+            // If this overflows (longest_candidate = 0), that means there are no needles,
+            // so there is no need to have any overlap
+            .unwrap_or(0);
         let mut this = self.project();
         // Still data in buffer
         if *this.consumed < this.buffer.len() {