diff --git a/changelog.d/unreleased/2876.security.md b/changelog.d/unreleased/2876.security.md new file mode 100644 index 0000000000..4a0efb0789 --- /dev/null +++ b/changelog.d/unreleased/2876.security.md @@ -0,0 +1,17 @@ +--- +category: security +issues: + - 2876 +affected: + - src/CodeIndex/Indexer/BoundedRegex.cs + - src/CodeIndex/Indexer/Symbols + - tests/CodeIndex.Tests/SymbolExtractorTests.cs +--- + +## English + +- **Bounded built-in symbol extraction regexes (#2876)** — built-in symbol extraction regular expressions now run with explicit match timeouts and fail closed on timeout instead of allowing hostile long lines to consume unbounded CPU. + +## 日本語 + +- **組み込みシンボル抽出 regex に上限を設定しました (#2876)** — 組み込みシンボル抽出の正規表現に明示的な match timeout を設定し、悪意ある長い行が無制限に CPU を消費しないよう timeout 時は安全側で不一致として扱います。 diff --git a/changelog.d/unreleased/2887.security.md b/changelog.d/unreleased/2887.security.md new file mode 100644 index 0000000000..bfd9a80c82 --- /dev/null +++ b/changelog.d/unreleased/2887.security.md @@ -0,0 +1,16 @@ +--- +category: security +issues: + - 2887 +affected: + - src/CodeIndex/Indexer/References + - tests/CodeIndex.Tests/ReferenceExtractorTests.cs +--- + +## English + +- **Bounded reference extraction regexes (#2887)** — reference extraction regular expressions, including static replace calls, now run through bounded match timeouts and fail closed on timeout for hostile long-line inputs. + +## 日本語 + +- **参照抽出 regex に上限を設定しました (#2887)** — 静的な replace 呼び出しを含む参照抽出の正規表現を bounded match timeout 経由にし、悪意ある長い行で timeout した場合は安全側で処理を打ち切ります。 diff --git a/src/CodeIndex/Indexer/BoundedRegex.cs b/src/CodeIndex/Indexer/BoundedRegex.cs new file mode 100644 index 0000000000..daec250045 --- /dev/null +++ b/src/CodeIndex/Indexer/BoundedRegex.cs @@ -0,0 +1,221 @@ +using System.Text.RegularExpressions; +using BclMatch = System.Text.RegularExpressions.Match; +using BclRegex = System.Text.RegularExpressions.Regex; + +namespace CodeIndex.Indexer; + +internal sealed class BoundedRegex : BclRegex +{ + internal static readonly TimeSpan DefaultMatchTimeout = TimeSpan.FromMilliseconds(250); + + public BoundedRegex(string pattern) + : base(pattern, RegexOptions.None, DefaultMatchTimeout) + { + } + + public BoundedRegex(string pattern, RegexOptions options) + : base(pattern, options, DefaultMatchTimeout) + { + } + + public BoundedRegex(string pattern, RegexOptions options, TimeSpan matchTimeout) + : base(pattern, options, matchTimeout) + { + } + + public static new string Escape(string str) => BclRegex.Escape(str); + + public static new string Unescape(string str) => BclRegex.Unescape(str); + + public static new Match Match(string input, string pattern) => + Match(input, pattern, RegexOptions.None); + + public static new Match Match(string input, string pattern, RegexOptions options) + { + try + { + return BclRegex.Match(input, pattern, options, DefaultMatchTimeout); + } + catch (RegexMatchTimeoutException) + { + return BclMatch.Empty; + } + } + + public static new MatchCollection Matches(string input, string pattern) => + Matches(input, pattern, RegexOptions.None); + + public static new MatchCollection Matches(string input, string pattern, RegexOptions options) + { + try + { + var matches = BclRegex.Matches(input, pattern, options, DefaultMatchTimeout); + _ = matches.Count; + return matches; + } + catch (RegexMatchTimeoutException) + { + return EmptyMatches(); + } + } + + public static new bool IsMatch(string input, string pattern) => + IsMatch(input, pattern, RegexOptions.None); + + public static new bool IsMatch(string input, string pattern, RegexOptions options) + { + try + { + return BclRegex.IsMatch(input, pattern, options, DefaultMatchTimeout); + } + catch (RegexMatchTimeoutException) + { + return false; + } + } + + public static new string Replace(string input, string pattern, string replacement) => + Replace(input, pattern, replacement, RegexOptions.None); + + public static new string Replace(string input, string pattern, string replacement, RegexOptions options) + { + try + { + return BclRegex.Replace(input, pattern, replacement, options, DefaultMatchTimeout); + } + catch (RegexMatchTimeoutException) + { + return input; + } + } + + public static new string Replace(string input, string pattern, MatchEvaluator evaluator) => + Replace(input, pattern, evaluator, RegexOptions.None); + + public static new string Replace(string input, string pattern, MatchEvaluator evaluator, RegexOptions options) + { + try + { + return BclRegex.Replace(input, pattern, evaluator, options, DefaultMatchTimeout); + } + catch (RegexMatchTimeoutException) + { + return input; + } + } + + public new Match Match(string input) + { + try + { + return base.Match(input); + } + catch (RegexMatchTimeoutException) + { + return BclMatch.Empty; + } + } + + public new Match Match(string input, int startat) + { + try + { + return base.Match(input, startat); + } + catch (RegexMatchTimeoutException) + { + return BclMatch.Empty; + } + } + + public new Match Match(string input, int beginning, int length) + { + try + { + return base.Match(input, beginning, length); + } + catch (RegexMatchTimeoutException) + { + return BclMatch.Empty; + } + } + + public new MatchCollection Matches(string input) + { + try + { + var matches = base.Matches(input); + _ = matches.Count; + return matches; + } + catch (RegexMatchTimeoutException) + { + return EmptyMatches(); + } + } + + public new MatchCollection Matches(string input, int startat) + { + try + { + var matches = base.Matches(input, startat); + _ = matches.Count; + return matches; + } + catch (RegexMatchTimeoutException) + { + return EmptyMatches(); + } + } + + public new bool IsMatch(string input) + { + try + { + return base.IsMatch(input); + } + catch (RegexMatchTimeoutException) + { + return false; + } + } + + public new bool IsMatch(string input, int startat) + { + try + { + return base.IsMatch(input, startat); + } + catch (RegexMatchTimeoutException) + { + return false; + } + } + + public new string Replace(string input, string replacement) + { + try + { + return base.Replace(input, replacement); + } + catch (RegexMatchTimeoutException) + { + return input; + } + } + + public new string Replace(string input, MatchEvaluator evaluator) + { + try + { + return base.Replace(input, evaluator); + } + catch (RegexMatchTimeoutException) + { + return input; + } + } + + private static MatchCollection EmptyMatches() => + BclRegex.Matches(string.Empty, @"\b\B", RegexOptions.None, DefaultMatchTimeout); +} diff --git a/src/CodeIndex/Indexer/References/Languages/AssemblyReferenceExtractor.cs b/src/CodeIndex/Indexer/References/Languages/AssemblyReferenceExtractor.cs index d3dd963d06..ed60df3cef 100644 --- a/src/CodeIndex/Indexer/References/Languages/AssemblyReferenceExtractor.cs +++ b/src/CodeIndex/Indexer/References/Languages/AssemblyReferenceExtractor.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using CodeIndex.Models; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/References/Languages/BatchReferenceExtractor.cs b/src/CodeIndex/Indexer/References/Languages/BatchReferenceExtractor.cs index ff0cfbfcd5..c32175479a 100644 --- a/src/CodeIndex/Indexer/References/Languages/BatchReferenceExtractor.cs +++ b/src/CodeIndex/Indexer/References/Languages/BatchReferenceExtractor.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using CodeIndex.Models; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/References/Languages/CSharpReferenceExtractor.Support.cs b/src/CodeIndex/Indexer/References/Languages/CSharpReferenceExtractor.Support.cs index ae2c1b757e..b52efac45b 100644 --- a/src/CodeIndex/Indexer/References/Languages/CSharpReferenceExtractor.Support.cs +++ b/src/CodeIndex/Indexer/References/Languages/CSharpReferenceExtractor.Support.cs @@ -1,5 +1,6 @@ using System.Text; using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using CodeIndex.Models; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/References/Languages/CSharpReferenceExtractor.ValueReceivers.cs b/src/CodeIndex/Indexer/References/Languages/CSharpReferenceExtractor.ValueReceivers.cs index 8f12452186..2e1fc3ff3e 100644 --- a/src/CodeIndex/Indexer/References/Languages/CSharpReferenceExtractor.ValueReceivers.cs +++ b/src/CodeIndex/Indexer/References/Languages/CSharpReferenceExtractor.ValueReceivers.cs @@ -1,5 +1,6 @@ using System.Text; using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using CodeIndex.Models; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/References/Languages/CSharpReferenceExtractor.cs b/src/CodeIndex/Indexer/References/Languages/CSharpReferenceExtractor.cs index df3afc0763..46b291ab63 100644 --- a/src/CodeIndex/Indexer/References/Languages/CSharpReferenceExtractor.cs +++ b/src/CodeIndex/Indexer/References/Languages/CSharpReferenceExtractor.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using CodeIndex.Models; using CSharpContainingTypeValueReceiverNames = CodeIndex.Indexer.ReferenceExtractor.CSharpContainingTypeValueReceiverNames; using CSharpFunctionValueReceiverNameRecord = CodeIndex.Indexer.ReferenceExtractor.CSharpFunctionValueReceiverNameRecord; diff --git a/src/CodeIndex/Indexer/References/Languages/CobolReferenceExtractor.cs b/src/CodeIndex/Indexer/References/Languages/CobolReferenceExtractor.cs index 45b66bc617..5651a825fd 100644 --- a/src/CodeIndex/Indexer/References/Languages/CobolReferenceExtractor.cs +++ b/src/CodeIndex/Indexer/References/Languages/CobolReferenceExtractor.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using CodeIndex.Models; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/References/Languages/CppReferenceExtractor.cs b/src/CodeIndex/Indexer/References/Languages/CppReferenceExtractor.cs index 1a0680f2d5..76ed638725 100644 --- a/src/CodeIndex/Indexer/References/Languages/CppReferenceExtractor.cs +++ b/src/CodeIndex/Indexer/References/Languages/CppReferenceExtractor.cs @@ -1,5 +1,6 @@ using CodeIndex.Models; using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/References/Languages/CssReferenceExtractor.cs b/src/CodeIndex/Indexer/References/Languages/CssReferenceExtractor.cs index b3409dfd8b..3054ad61ae 100644 --- a/src/CodeIndex/Indexer/References/Languages/CssReferenceExtractor.cs +++ b/src/CodeIndex/Indexer/References/Languages/CssReferenceExtractor.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using CodeIndex.Models; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/References/Languages/DartReferenceExtractor.cs b/src/CodeIndex/Indexer/References/Languages/DartReferenceExtractor.cs index 99eb80ce43..a6532addd9 100644 --- a/src/CodeIndex/Indexer/References/Languages/DartReferenceExtractor.cs +++ b/src/CodeIndex/Indexer/References/Languages/DartReferenceExtractor.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using CodeIndex.Models; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/References/Languages/DockerfileReferenceExtractor.cs b/src/CodeIndex/Indexer/References/Languages/DockerfileReferenceExtractor.cs index db27abe606..0956bda828 100644 --- a/src/CodeIndex/Indexer/References/Languages/DockerfileReferenceExtractor.cs +++ b/src/CodeIndex/Indexer/References/Languages/DockerfileReferenceExtractor.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using CodeIndex.Models; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/References/Languages/ElixirReferenceExtractor.cs b/src/CodeIndex/Indexer/References/Languages/ElixirReferenceExtractor.cs index 2c8f06e2de..6c3cae88dc 100644 --- a/src/CodeIndex/Indexer/References/Languages/ElixirReferenceExtractor.cs +++ b/src/CodeIndex/Indexer/References/Languages/ElixirReferenceExtractor.cs @@ -1,5 +1,6 @@ using CodeIndex.Models; using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/References/Languages/FSharpReferenceExtractor.cs b/src/CodeIndex/Indexer/References/Languages/FSharpReferenceExtractor.cs index 5fd4906ea6..0beadd447e 100644 --- a/src/CodeIndex/Indexer/References/Languages/FSharpReferenceExtractor.cs +++ b/src/CodeIndex/Indexer/References/Languages/FSharpReferenceExtractor.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/References/Languages/GoReferenceExtractor.cs b/src/CodeIndex/Indexer/References/Languages/GoReferenceExtractor.cs index 0ffe591630..59e1d3919a 100644 --- a/src/CodeIndex/Indexer/References/Languages/GoReferenceExtractor.cs +++ b/src/CodeIndex/Indexer/References/Languages/GoReferenceExtractor.cs @@ -1,20 +1,22 @@ +using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using CodeIndex.Models; namespace CodeIndex.Indexer; internal static class GoReferenceExtractor { - private static readonly System.Text.RegularExpressions.Regex GoroutineCallRegex = new( + private static readonly Regex GoroutineCallRegex = new( @"\bgo\s+(?[A-Za-z_]\w*(?:\.[A-Za-z_]\w*)*)\s*\(", - System.Text.RegularExpressions.RegexOptions.Compiled | System.Text.RegularExpressions.RegexOptions.CultureInvariant); + RegexOptions.Compiled | RegexOptions.CultureInvariant); - private static readonly System.Text.RegularExpressions.Regex ChannelSendRegex = new( + private static readonly Regex ChannelSendRegex = new( @"(?[A-Za-z_]\w*)\s*<-", - System.Text.RegularExpressions.RegexOptions.Compiled | System.Text.RegularExpressions.RegexOptions.CultureInvariant); + RegexOptions.Compiled | RegexOptions.CultureInvariant); - private static readonly System.Text.RegularExpressions.Regex ChannelReceiveRegex = new( + private static readonly Regex ChannelReceiveRegex = new( @"(?[A-Za-z_]\w*)", - System.Text.RegularExpressions.RegexOptions.Compiled | System.Text.RegularExpressions.RegexOptions.CultureInvariant); + RegexOptions.Compiled | RegexOptions.CultureInvariant); public static bool[] BuildImportBlockLineMap(IReadOnlyList originalLines) => LanguageReferenceExtractionSupport.BuildGoImportBlockLineMap(originalLines); @@ -28,7 +30,7 @@ public static void EmitConcurrencyReferences( int lineNumber, Func resolveContainerForColumn) { - foreach (System.Text.RegularExpressions.Match match in GoroutineCallRegex.Matches(preparedLine)) + foreach (Match match in GoroutineCallRegex.Matches(preparedLine)) { var group = match.Groups["name"]; var rawName = group.Value; @@ -47,7 +49,7 @@ public static void EmitConcurrencyReferences( resolveContainerForColumn(nameIndex)); } - foreach (System.Text.RegularExpressions.Match match in ChannelSendRegex.Matches(preparedLine)) + foreach (Match match in ChannelSendRegex.Matches(preparedLine)) { ReferenceExtractor.AddReference( references, @@ -61,7 +63,7 @@ public static void EmitConcurrencyReferences( resolveContainerForColumn(match.Groups["name"].Index)); } - foreach (System.Text.RegularExpressions.Match match in ChannelReceiveRegex.Matches(preparedLine)) + foreach (Match match in ChannelReceiveRegex.Matches(preparedLine)) { if (!IsGoChannelReceiveArrow(preparedLine, match.Index)) continue; diff --git a/src/CodeIndex/Indexer/References/Languages/GradleReferenceExtractor.cs b/src/CodeIndex/Indexer/References/Languages/GradleReferenceExtractor.cs index 69896010ee..b366389950 100644 --- a/src/CodeIndex/Indexer/References/Languages/GradleReferenceExtractor.cs +++ b/src/CodeIndex/Indexer/References/Languages/GradleReferenceExtractor.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/References/Languages/JavaReferenceExtractor.cs b/src/CodeIndex/Indexer/References/Languages/JavaReferenceExtractor.cs index a0d4377ae6..a88e878000 100644 --- a/src/CodeIndex/Indexer/References/Languages/JavaReferenceExtractor.cs +++ b/src/CodeIndex/Indexer/References/Languages/JavaReferenceExtractor.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using CodeIndex.Models; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/References/Languages/JavaScriptReferenceExtractor.cs b/src/CodeIndex/Indexer/References/Languages/JavaScriptReferenceExtractor.cs index d3673fa5d4..befba17945 100644 --- a/src/CodeIndex/Indexer/References/Languages/JavaScriptReferenceExtractor.cs +++ b/src/CodeIndex/Indexer/References/Languages/JavaScriptReferenceExtractor.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using CodeIndex.Models; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/References/Languages/KotlinReferenceExtractor.cs b/src/CodeIndex/Indexer/References/Languages/KotlinReferenceExtractor.cs index 3d0fff8bfb..6ade04cf34 100644 --- a/src/CodeIndex/Indexer/References/Languages/KotlinReferenceExtractor.cs +++ b/src/CodeIndex/Indexer/References/Languages/KotlinReferenceExtractor.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using CodeIndex.Models; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/References/Languages/PerlReferenceExtractor.cs b/src/CodeIndex/Indexer/References/Languages/PerlReferenceExtractor.cs index 6c980dec7a..b41a3c8997 100644 --- a/src/CodeIndex/Indexer/References/Languages/PerlReferenceExtractor.cs +++ b/src/CodeIndex/Indexer/References/Languages/PerlReferenceExtractor.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using CodeIndex.Models; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/References/Languages/PhpReferenceExtractor.cs b/src/CodeIndex/Indexer/References/Languages/PhpReferenceExtractor.cs index def5dbfb09..b5247de820 100644 --- a/src/CodeIndex/Indexer/References/Languages/PhpReferenceExtractor.cs +++ b/src/CodeIndex/Indexer/References/Languages/PhpReferenceExtractor.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using CodeIndex.Models; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/References/Languages/PowerShellReferenceExtractor.cs b/src/CodeIndex/Indexer/References/Languages/PowerShellReferenceExtractor.cs index 2bca0c4f05..9bcc7ec4fb 100644 --- a/src/CodeIndex/Indexer/References/Languages/PowerShellReferenceExtractor.cs +++ b/src/CodeIndex/Indexer/References/Languages/PowerShellReferenceExtractor.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/References/Languages/PythonReferenceExtractor.cs b/src/CodeIndex/Indexer/References/Languages/PythonReferenceExtractor.cs index 462f8cb86b..87ce1141ec 100644 --- a/src/CodeIndex/Indexer/References/Languages/PythonReferenceExtractor.cs +++ b/src/CodeIndex/Indexer/References/Languages/PythonReferenceExtractor.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using CodeIndex.Models; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/References/Languages/RReferenceExtractor.cs b/src/CodeIndex/Indexer/References/Languages/RReferenceExtractor.cs index fda8e33996..edd555f308 100644 --- a/src/CodeIndex/Indexer/References/Languages/RReferenceExtractor.cs +++ b/src/CodeIndex/Indexer/References/Languages/RReferenceExtractor.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using CodeIndex.Models; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/References/Languages/RubyReferenceExtractor.cs b/src/CodeIndex/Indexer/References/Languages/RubyReferenceExtractor.cs index 9eee202330..13211ec106 100644 --- a/src/CodeIndex/Indexer/References/Languages/RubyReferenceExtractor.cs +++ b/src/CodeIndex/Indexer/References/Languages/RubyReferenceExtractor.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using CodeIndex.Models; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/References/Languages/RustReferenceExtractor.cs b/src/CodeIndex/Indexer/References/Languages/RustReferenceExtractor.cs index c7875fe19c..12225606f2 100644 --- a/src/CodeIndex/Indexer/References/Languages/RustReferenceExtractor.cs +++ b/src/CodeIndex/Indexer/References/Languages/RustReferenceExtractor.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using CodeIndex.Models; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/References/Languages/ScalaReferenceExtractor.cs b/src/CodeIndex/Indexer/References/Languages/ScalaReferenceExtractor.cs index 536568a44c..1f3e72fc8e 100644 --- a/src/CodeIndex/Indexer/References/Languages/ScalaReferenceExtractor.cs +++ b/src/CodeIndex/Indexer/References/Languages/ScalaReferenceExtractor.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using CodeIndex.Models; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/References/Languages/ShellReferenceExtractor.cs b/src/CodeIndex/Indexer/References/Languages/ShellReferenceExtractor.cs index 932b1f6cd1..29426d5be3 100644 --- a/src/CodeIndex/Indexer/References/Languages/ShellReferenceExtractor.cs +++ b/src/CodeIndex/Indexer/References/Languages/ShellReferenceExtractor.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using CodeIndex.Models; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/References/Languages/SqlReferenceExtractor.Patterns.cs b/src/CodeIndex/Indexer/References/Languages/SqlReferenceExtractor.Patterns.cs index 6c6c114cce..d14658ad99 100644 --- a/src/CodeIndex/Indexer/References/Languages/SqlReferenceExtractor.Patterns.cs +++ b/src/CodeIndex/Indexer/References/Languages/SqlReferenceExtractor.Patterns.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/References/Languages/SqlReferenceExtractor.cs b/src/CodeIndex/Indexer/References/Languages/SqlReferenceExtractor.cs index ba0aec4db9..d543c119e7 100644 --- a/src/CodeIndex/Indexer/References/Languages/SqlReferenceExtractor.cs +++ b/src/CodeIndex/Indexer/References/Languages/SqlReferenceExtractor.cs @@ -1,5 +1,6 @@ using System.Text; using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using CodeIndex.Models; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/References/Languages/SwiftReferenceExtractor.cs b/src/CodeIndex/Indexer/References/Languages/SwiftReferenceExtractor.cs index 0fb91a01ed..17cc54aa22 100644 --- a/src/CodeIndex/Indexer/References/Languages/SwiftReferenceExtractor.cs +++ b/src/CodeIndex/Indexer/References/Languages/SwiftReferenceExtractor.cs @@ -1,5 +1,6 @@ using CodeIndex.Models; using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/References/Languages/TerraformReferenceExtractor.cs b/src/CodeIndex/Indexer/References/Languages/TerraformReferenceExtractor.cs index aa0990c7d3..766b0e054d 100644 --- a/src/CodeIndex/Indexer/References/Languages/TerraformReferenceExtractor.cs +++ b/src/CodeIndex/Indexer/References/Languages/TerraformReferenceExtractor.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using CodeIndex.Models; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/References/Languages/TypeScriptReferenceExtractor.cs b/src/CodeIndex/Indexer/References/Languages/TypeScriptReferenceExtractor.cs index 4f03601da6..e18138065c 100644 --- a/src/CodeIndex/Indexer/References/Languages/TypeScriptReferenceExtractor.cs +++ b/src/CodeIndex/Indexer/References/Languages/TypeScriptReferenceExtractor.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using CodeIndex.Models; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/References/ReferenceExtractor.Core.cs b/src/CodeIndex/Indexer/References/ReferenceExtractor.Core.cs index 021a34667f..d2ae55f631 100644 --- a/src/CodeIndex/Indexer/References/ReferenceExtractor.Core.cs +++ b/src/CodeIndex/Indexer/References/ReferenceExtractor.Core.cs @@ -1,5 +1,6 @@ using System.Text; using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using CodeIndex.Models; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/References/ReferenceExtractor.PatternTypeReferences.cs b/src/CodeIndex/Indexer/References/ReferenceExtractor.PatternTypeReferences.cs index 270fb4f331..6d5fc1dd15 100644 --- a/src/CodeIndex/Indexer/References/ReferenceExtractor.PatternTypeReferences.cs +++ b/src/CodeIndex/Indexer/References/ReferenceExtractor.PatternTypeReferences.cs @@ -1,5 +1,6 @@ using System.Text; using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using CodeIndex.Models; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/References/ReferenceExtractor.TypeReferences.cs b/src/CodeIndex/Indexer/References/ReferenceExtractor.TypeReferences.cs index 817ac6df39..8fee38f424 100644 --- a/src/CodeIndex/Indexer/References/ReferenceExtractor.TypeReferences.cs +++ b/src/CodeIndex/Indexer/References/ReferenceExtractor.TypeReferences.cs @@ -1,5 +1,6 @@ using System.Text; using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using CodeIndex.Models; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/References/ReferenceExtractor.cs b/src/CodeIndex/Indexer/References/ReferenceExtractor.cs index 6e4f734718..9a16c38289 100644 --- a/src/CodeIndex/Indexer/References/ReferenceExtractor.cs +++ b/src/CodeIndex/Indexer/References/ReferenceExtractor.cs @@ -1,5 +1,6 @@ using System.Text; using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using CodeIndex.Indexer.Extensibility; using CodeIndex.Models; diff --git a/src/CodeIndex/Indexer/References/Support/JvmMethodReferenceExtractor.cs b/src/CodeIndex/Indexer/References/Support/JvmMethodReferenceExtractor.cs index 2e4aa83f14..9063f238ab 100644 --- a/src/CodeIndex/Indexer/References/Support/JvmMethodReferenceExtractor.cs +++ b/src/CodeIndex/Indexer/References/Support/JvmMethodReferenceExtractor.cs @@ -1,5 +1,6 @@ using System.Text; using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using CodeIndex.Models; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/References/Support/LanguageReferenceExtractionSupport.cs b/src/CodeIndex/Indexer/References/Support/LanguageReferenceExtractionSupport.cs index 6731446adf..ce58e55643 100644 --- a/src/CodeIndex/Indexer/References/Support/LanguageReferenceExtractionSupport.cs +++ b/src/CodeIndex/Indexer/References/Support/LanguageReferenceExtractionSupport.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using CodeIndex.Models; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/References/Support/TrailingLambdaReferenceExtractor.cs b/src/CodeIndex/Indexer/References/Support/TrailingLambdaReferenceExtractor.cs index 84937312b4..6df8c81ea4 100644 --- a/src/CodeIndex/Indexer/References/Support/TrailingLambdaReferenceExtractor.cs +++ b/src/CodeIndex/Indexer/References/Support/TrailingLambdaReferenceExtractor.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/Symbols/CSharpSymbolNameNormalizer.cs b/src/CodeIndex/Indexer/Symbols/CSharpSymbolNameNormalizer.cs index 60beda7dc6..e608c5b994 100644 --- a/src/CodeIndex/Indexer/Symbols/CSharpSymbolNameNormalizer.cs +++ b/src/CodeIndex/Indexer/Symbols/CSharpSymbolNameNormalizer.cs @@ -1,5 +1,6 @@ using System.Text; using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using CodeIndex.Database; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Assembly.cs b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Assembly.cs index 42406450fe..ff0bd33c3f 100644 --- a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Assembly.cs +++ b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Assembly.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using CodeIndex.Models; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.CSharpScanner.cs b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.CSharpScanner.cs index c7d768fa87..a6f616dc75 100644 --- a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.CSharpScanner.cs +++ b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.CSharpScanner.cs @@ -1,5 +1,6 @@ using System.Text; using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using System.Runtime.CompilerServices; using CodeIndex.Models; diff --git a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Cobol.cs b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Cobol.cs index 49495e00da..62d3f245aa 100644 --- a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Cobol.cs +++ b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Cobol.cs @@ -1,5 +1,6 @@ using System.Text; using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using System.Runtime.CompilerServices; using CodeIndex.Models; diff --git a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Cpp.cs b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Cpp.cs index 520ccac045..e2ad9cf9c7 100644 --- a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Cpp.cs +++ b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Cpp.cs @@ -1,5 +1,6 @@ using System.Text; using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using System.Runtime.CompilerServices; using CodeIndex.Models; diff --git a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Css.cs b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Css.cs index e4525fb1f6..cf7bb630de 100644 --- a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Css.cs +++ b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Css.cs @@ -1,5 +1,6 @@ using System.Text; using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using System.Runtime.CompilerServices; using CodeIndex.Models; diff --git a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Elixir.cs b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Elixir.cs index a34a45b8f6..04c73b0873 100644 --- a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Elixir.cs +++ b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Elixir.cs @@ -1,5 +1,6 @@ using System.Text; using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using System.Runtime.CompilerServices; using CodeIndex.Models; diff --git a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.FSharp.cs b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.FSharp.cs index eafbc540ea..febdfab780 100644 --- a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.FSharp.cs +++ b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.FSharp.cs @@ -1,5 +1,6 @@ using System.Text; using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using System.Runtime.CompilerServices; using CodeIndex.Models; diff --git a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Fortran.cs b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Fortran.cs index 736e4671b8..214b6147c8 100644 --- a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Fortran.cs +++ b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Fortran.cs @@ -1,5 +1,6 @@ using System.Text; using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using System.Runtime.CompilerServices; using CodeIndex.Models; diff --git a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Go.cs b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Go.cs index 6654d58c51..7b0d5bb484 100644 --- a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Go.cs +++ b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Go.cs @@ -1,5 +1,6 @@ using System.Text; using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using System.Runtime.CompilerServices; using CodeIndex.Models; diff --git a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Java.cs b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Java.cs index edb2f6f2ec..ca6d35e8b5 100644 --- a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Java.cs +++ b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Java.cs @@ -1,5 +1,6 @@ using System.Text; using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using System.Runtime.CompilerServices; using CodeIndex.Models; diff --git a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.JavaScriptTypeScriptSupport.cs b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.JavaScriptTypeScriptSupport.cs index 1fe39124d2..2a3a499f2b 100644 --- a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.JavaScriptTypeScriptSupport.cs +++ b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.JavaScriptTypeScriptSupport.cs @@ -1,5 +1,6 @@ using System.Text; using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using System.Runtime.CompilerServices; using CodeIndex.Models; diff --git a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.KotlinScala.cs b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.KotlinScala.cs index e0a2086904..7a2caff2ec 100644 --- a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.KotlinScala.cs +++ b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.KotlinScala.cs @@ -1,5 +1,6 @@ using System.Text; using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using System.Runtime.CompilerServices; using CodeIndex.Models; diff --git a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Markup.cs b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Markup.cs index 8e8fbddaf7..1a7bd8f375 100644 --- a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Markup.cs +++ b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Markup.cs @@ -1,5 +1,6 @@ using System.Text; using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using System.Runtime.CompilerServices; using CodeIndex.Models; diff --git a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Pascal.cs b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Pascal.cs index f192626d01..51f322ff8f 100644 --- a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Pascal.cs +++ b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Pascal.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Perl.cs b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Perl.cs index e1b0586c06..286892ba47 100644 --- a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Perl.cs +++ b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Perl.cs @@ -1,6 +1,7 @@ using System.Globalization; using System.Text; using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using CodeIndex.Models; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Php.cs b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Php.cs index dca379f07a..6dff7612be 100644 --- a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Php.cs +++ b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Php.cs @@ -1,5 +1,6 @@ using System.Text; using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using System.Runtime.CompilerServices; using CodeIndex.Models; diff --git a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Python.cs b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Python.cs index cf16f983c6..058a5487e2 100644 --- a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Python.cs +++ b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Python.cs @@ -1,5 +1,6 @@ using System.Text; using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using System.Runtime.CompilerServices; using CodeIndex.Models; diff --git a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Razor.cs b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Razor.cs index 773d44a9d8..4b45320f7e 100644 --- a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Razor.cs +++ b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Razor.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using CodeIndex.Models; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Ruby.cs b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Ruby.cs index bb7958fecf..f2f3a4ac08 100644 --- a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Ruby.cs +++ b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Ruby.cs @@ -1,5 +1,6 @@ using System.Text; using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using System.Runtime.CompilerServices; using CodeIndex.Models; diff --git a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Rust.cs b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Rust.cs index fb38952d6a..53f56c1b62 100644 --- a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Rust.cs +++ b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Rust.cs @@ -1,5 +1,6 @@ using System.Text; using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using System.Runtime.CompilerServices; using CodeIndex.Models; diff --git a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Shell.cs b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Shell.cs index 7992d418b9..145e812faf 100644 --- a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Shell.cs +++ b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Shell.cs @@ -1,5 +1,6 @@ using System.Text; using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using System.Runtime.CompilerServices; using CodeIndex.Models; diff --git a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Smalltalk.cs b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Smalltalk.cs index 9a425a6721..b8ca7fa699 100644 --- a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Smalltalk.cs +++ b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Smalltalk.cs @@ -1,4 +1,5 @@ using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; namespace CodeIndex.Indexer; diff --git a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Sql.cs b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Sql.cs index 6cb41e620e..4b26fa94cf 100644 --- a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Sql.cs +++ b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Sql.cs @@ -1,5 +1,6 @@ using System.Text; using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using System.Runtime.CompilerServices; using CodeIndex.Models; diff --git a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Svelte.cs b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Svelte.cs index 243645d1b5..e407a2c234 100644 --- a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Svelte.cs +++ b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.Svelte.cs @@ -1,5 +1,6 @@ using System.Text; using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using System.Runtime.CompilerServices; using CodeIndex.Models; diff --git a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.VisualBasic.cs b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.VisualBasic.cs index b4e6b88b7a..17679ec70f 100644 --- a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.VisualBasic.cs +++ b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.VisualBasic.cs @@ -1,5 +1,6 @@ using System.Text; using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using System.Runtime.CompilerServices; using CodeIndex.Models; diff --git a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.cs b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.cs index acffdd257f..9d51273923 100644 --- a/src/CodeIndex/Indexer/Symbols/SymbolExtractor.cs +++ b/src/CodeIndex/Indexer/Symbols/SymbolExtractor.cs @@ -1,6 +1,7 @@ using System.Text; using System.Text.Json; using System.Text.RegularExpressions; +using Regex = CodeIndex.Indexer.BoundedRegex; using System.Runtime.CompilerServices; using CodeIndex.Indexer.Extensibility; using CodeIndex.Models; diff --git a/tests/CodeIndex.Tests/ReferenceExtractorTests.cs b/tests/CodeIndex.Tests/ReferenceExtractorTests.cs index 294e40d863..260e3c7602 100644 --- a/tests/CodeIndex.Tests/ReferenceExtractorTests.cs +++ b/tests/CodeIndex.Tests/ReferenceExtractorTests.cs @@ -1,4 +1,8 @@ +using System.Collections; +using System.Diagnostics; +using System.Reflection; using System.Text; +using System.Text.RegularExpressions; using CodeIndex.Indexer; using CodeIndex.Indexer.Extensibility; using CodeIndex.Models; @@ -21,6 +25,48 @@ public void Extract_CancelledToken_ThrowsBeforeWork() ReferenceExtractor.Extract(1, "csharp", "public class App { }", [], cancellationToken: cancellation.Token)); } + [Fact] + public void BuiltInReferenceRegexes_HaveBoundedMatchTimeouts() + { + var regexes = EnumerateStaticRegexValues( + typeof(ReferenceExtractor).Assembly.GetTypes().Where(IsReferenceRegexOwnerType)) + .ToList(); + + Assert.NotEmpty(regexes); + + var infiniteTimeouts = regexes + .Where(item => item.Regex.MatchTimeout == Regex.InfiniteMatchTimeout) + .Select(item => item.Path) + .ToList(); + + Assert.True( + infiniteTimeouts.Count == 0, + "Built-in reference regexes must have explicit match timeouts: " + string.Join(", ", infiniteTimeouts)); + } + + [Fact] + public void Extract_BuiltInReferenceRegexes_AdversarialLongLinesDoNotThrow() + { + var pythonContent = "def use(value: '" + new string('A', 2000) + "'):\n return value\n"; + const string goContent = "func main() { go worker.Run(); ch <- value; value = <-ch }\n"; + + var stopwatch = Stopwatch.StartNew(); + var exception = Record.Exception(() => + { + var pythonSymbols = SymbolExtractor.Extract(1, "python", pythonContent); + ReferenceExtractor.Extract(1, "python", pythonContent, pythonSymbols); + + var goSymbols = SymbolExtractor.Extract(2, "go", goContent); + ReferenceExtractor.Extract(2, "go", goContent, goSymbols); + }); + stopwatch.Stop(); + + Assert.Null(exception); + Assert.True( + stopwatch.Elapsed < TimeSpan.FromSeconds(10), + $"Adversarial reference extraction took {stopwatch.Elapsed}."); + } + [Fact] public void Extract_CSharpSelfCall_StampsSelfReference() { @@ -32994,6 +33040,104 @@ void Run() && r.ReferenceKind == "capture"); } + private static bool IsReferenceRegexOwnerType(Type type) => + type.Namespace == "CodeIndex.Indexer" + && (type.Name.Contains("Reference", StringComparison.Ordinal) + || type.Name == "StructuralLineMasker" + || type.Name == "SqlNameResolver"); + + private static IEnumerable<(string Path, Regex Regex)> EnumerateStaticRegexValues(IEnumerable types) + { + foreach (var type in types) + { + foreach (var field in type.GetFields(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)) + { + object? value; + try + { + value = field.GetValue(null); + } + catch (TargetInvocationException) + { + throw; + } + + foreach (var item in EnumerateRegexValues(value, $"{type.Name}.{field.Name}", new HashSet(ReferenceEqualityComparer.Instance))) + yield return item; + } + } + } + + private static IEnumerable<(string Path, Regex Regex)> EnumerateRegexValues(object? value, string path, HashSet seen) + { + if (value is null) + yield break; + + if (value is Regex regex) + { + yield return (path, regex); + yield break; + } + + if (value is string or Type or MemberInfo or Delegate) + yield break; + + var valueType = value.GetType(); + if (valueType.IsPrimitive || valueType.IsEnum) + yield break; + + if (!valueType.IsValueType && !seen.Add(value)) + yield break; + + if (value is IEnumerable enumerable) + { + var index = 0; + foreach (var item in enumerable) + { + foreach (var nested in EnumerateRegexValues(item, $"{path}[{index}]", seen)) + yield return nested; + index++; + } + + yield break; + } + + foreach (var field in valueType.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)) + { + object? child; + try + { + child = field.GetValue(value); + } + catch (TargetInvocationException) + { + continue; + } + + foreach (var nested in EnumerateRegexValues(child, $"{path}.{field.Name}", seen)) + yield return nested; + } + + foreach (var property in valueType.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)) + { + if (property.GetIndexParameters().Length != 0) + continue; + + object? child; + try + { + child = property.GetValue(value); + } + catch (TargetInvocationException) + { + continue; + } + + foreach (var nested in EnumerateRegexValues(child, $"{path}.{property.Name}", seen)) + yield return nested; + } + } + private static SymbolRecord Container(string name, string kind, int startLine, int endLine) => new() { diff --git a/tests/CodeIndex.Tests/SymbolExtractorTests.cs b/tests/CodeIndex.Tests/SymbolExtractorTests.cs index b95b8ad2e8..3590c6dc57 100644 --- a/tests/CodeIndex.Tests/SymbolExtractorTests.cs +++ b/tests/CodeIndex.Tests/SymbolExtractorTests.cs @@ -1,6 +1,7 @@ using System.Diagnostics; using System.Collections; using System.Reflection; +using System.Text.RegularExpressions; using System.Text.Json; using CodeIndex.Indexer; using CodeIndex.Indexer.Extensibility; @@ -24,6 +25,45 @@ public void Extract_CancelledToken_ThrowsBeforeWork() SymbolExtractor.Extract(1, "csharp", "public class App { }", cancellationToken: cancellation.Token)); } + [Fact] + public void BuiltInSymbolRegexes_HaveBoundedMatchTimeouts() + { + var regexes = EnumerateStaticRegexValues( + typeof(SymbolExtractor).Assembly.GetTypes().Where(IsSymbolRegexOwnerType)) + .ToList(); + + Assert.NotEmpty(regexes); + + var infiniteTimeouts = regexes + .Where(item => item.Regex.MatchTimeout == Regex.InfiniteMatchTimeout) + .Select(item => item.Path) + .ToList(); + + Assert.True( + infiniteTimeouts.Count == 0, + "Built-in symbol regexes must have explicit match timeouts: " + string.Join(", ", infiniteTimeouts)); + } + + [Fact] + public void Extract_BuiltInSymbolRegexes_AdversarialLongLinesDoNotThrow() + { + var typeScriptLine = "export const Component = React.memo<" + new string('A', 20000) + new string('<', 2000) + new string('>', 2000) + ">(value);"; + var cssLine = ":root { --" + new string('a', 50000) + ": " + new string('(', 2000) + "; }"; + + var stopwatch = Stopwatch.StartNew(); + var exception = Record.Exception(() => + { + SymbolExtractor.Extract(1, "typescript", typeScriptLine); + SymbolExtractor.Extract(2, "css", cssLine); + }); + stopwatch.Stop(); + + Assert.Null(exception); + Assert.True( + stopwatch.Elapsed < TimeSpan.FromSeconds(10), + $"Adversarial symbol extraction took {stopwatch.Elapsed}."); + } + [Fact] public void Extract_CustomSymbolPlugin_HandlesUnsupportedLanguage() { @@ -25750,6 +25790,102 @@ public void Extract_JavaScript_ResolvesJsconfigPathAliasImportsAndKeepsMissesLit } } + private static bool IsSymbolRegexOwnerType(Type type) => + type.Namespace == "CodeIndex.Indexer" + && (type.Name == "SymbolExtractor" || type.Name.EndsWith("SymbolNameNormalizer", StringComparison.Ordinal)); + + private static IEnumerable<(string Path, Regex Regex)> EnumerateStaticRegexValues(IEnumerable types) + { + foreach (var type in types) + { + foreach (var field in type.GetFields(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic)) + { + object? value; + try + { + value = field.GetValue(null); + } + catch (TargetInvocationException) + { + throw; + } + + foreach (var item in EnumerateRegexValues(value, $"{type.Name}.{field.Name}", new HashSet(ReferenceEqualityComparer.Instance))) + yield return item; + } + } + } + + private static IEnumerable<(string Path, Regex Regex)> EnumerateRegexValues(object? value, string path, HashSet seen) + { + if (value is null) + yield break; + + if (value is Regex regex) + { + yield return (path, regex); + yield break; + } + + if (value is string or Type or MemberInfo or Delegate) + yield break; + + var valueType = value.GetType(); + if (valueType.IsPrimitive || valueType.IsEnum) + yield break; + + if (!valueType.IsValueType && !seen.Add(value)) + yield break; + + if (value is IEnumerable enumerable) + { + var index = 0; + foreach (var item in enumerable) + { + foreach (var nested in EnumerateRegexValues(item, $"{path}[{index}]", seen)) + yield return nested; + index++; + } + + yield break; + } + + foreach (var field in valueType.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)) + { + object? child; + try + { + child = field.GetValue(value); + } + catch (TargetInvocationException) + { + continue; + } + + foreach (var nested in EnumerateRegexValues(child, $"{path}.{field.Name}", seen)) + yield return nested; + } + + foreach (var property in valueType.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)) + { + if (property.GetIndexParameters().Length != 0) + continue; + + object? child; + try + { + child = property.GetValue(value); + } + catch (TargetInvocationException) + { + continue; + } + + foreach (var nested in EnumerateRegexValues(child, $"{path}.{property.Name}", seen)) + yield return nested; + } + } + private static string WriteFile(string projectRoot, string relativePath, string content) { var path = Path.Combine(projectRoot, relativePath);