From 8d6d530597e9785bfb74aa77212809e8eda9b031 Mon Sep 17 00:00:00 2001 From: saschabuehrle Date: Mon, 16 Mar 2026 13:47:20 +0100 Subject: [PATCH] fix: prevent panic in cache reset methods when cache is None Fixed panic in OnePassCache, HybridCache, and ReverseHybridCache reset methods when attempting to reset a None cache with a Some builder. The issue was that reset() checked if builder.0 was Some but then called self.0.as_mut().unwrap() without verifying self.0 was also Some. This could happen when a cache was created with ::none() but reset with a builder that had an engine. The fix checks if self.0 is Some before calling reset, and if None, creates a new cache from the builder's engine. Fixes #1155 --- regex-automata/src/meta/wrappers.rs | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/regex-automata/src/meta/wrappers.rs b/regex-automata/src/meta/wrappers.rs index 6651cb9076..e44eeeae1a 100644 --- a/regex-automata/src/meta/wrappers.rs +++ b/regex-automata/src/meta/wrappers.rs @@ -489,7 +489,11 @@ impl OnePassCache { pub(crate) fn reset(&mut self, builder: &OnePass) { #[cfg(feature = "dfa-onepass")] if let Some(ref e) = builder.0 { - self.0.as_mut().unwrap().reset(&e.0); + if let Some(ref mut cache) = self.0 { + cache.reset(&e.0); + } else { + self.0 = Some(e.0.create_cache()); + } } } @@ -781,7 +785,11 @@ impl HybridCache { pub(crate) fn reset(&mut self, builder: &Hybrid) { #[cfg(feature = "hybrid")] if let Some(ref e) = builder.0 { - self.0.as_mut().unwrap().reset(&e.0); + if let Some(ref mut cache) = self.0 { + cache.reset(&e.0); + } else { + self.0 = Some(e.0.create_cache()); + } } } @@ -1186,7 +1194,11 @@ impl ReverseHybridCache { pub(crate) fn reset(&mut self, builder: &ReverseHybrid) { #[cfg(feature = "hybrid")] if let Some(ref e) = builder.0 { - self.0.as_mut().unwrap().reset(&e.0); + if let Some(ref mut cache) = self.0 { + cache.reset(&e.0); + } else { + self.0 = Some(e.0.create_cache()); + } } }