From 009c28071da7c9be9132b18e415d553df31b1597 Mon Sep 17 00:00:00 2001 From: Widthdom Date: Sun, 24 May 2026 23:23:17 +0900 Subject: [PATCH] Fix reversed ignore character ranges (#1624) --- changelog.d/unreleased/1624.fixed.md | 16 ++++++++++++++++ src/CodeIndex/Indexer/Scanning/FileIndexer.cs | 3 +++ tests/CodeIndex.Tests/FileIndexerTests.cs | 1 + 3 files changed, 20 insertions(+) create mode 100644 changelog.d/unreleased/1624.fixed.md diff --git a/changelog.d/unreleased/1624.fixed.md b/changelog.d/unreleased/1624.fixed.md new file mode 100644 index 0000000000..e99dcaa45a --- /dev/null +++ b/changelog.d/unreleased/1624.fixed.md @@ -0,0 +1,16 @@ +--- +category: fixed +issues: + - 1624 +affected: + - src/CodeIndex/Indexer/Scanning/FileIndexer.cs + - tests/CodeIndex.Tests/FileIndexerTests.cs +--- + +## English + +- **Reversed ignore character ranges are now rejected (#1624)** — `.gitignore` and `.cdidxignore` patterns such as `[z-a]` are skipped with a warning instead of compiling into a matcher that silently matches nothing. + +## 日本語 + +- **ignore ルールの逆順文字範囲を拒否するようにしました (#1624)** — `.gitignore` と `.cdidxignore` の `[z-a]` のような pattern は、何にも一致しない matcher として静かに受理されず、警告付きで skipped されます。 diff --git a/src/CodeIndex/Indexer/Scanning/FileIndexer.cs b/src/CodeIndex/Indexer/Scanning/FileIndexer.cs index aceacb2259..22df3ee83a 100644 --- a/src/CodeIndex/Indexer/Scanning/FileIndexer.cs +++ b/src/CodeIndex/Indexer/Scanning/FileIndexer.cs @@ -845,6 +845,9 @@ private static void AppendCharacterClassLiteral(StringBuilder builder, char ch, private static bool TryAppendCharacterClassRange(StringBuilder builder, char start, char end, bool ignoreCase) { + if (start > end) + throw new ArgumentException("reversed character class range"); + builder.Append(EscapeCharacterClassLiteral(start)); builder.Append('-'); builder.Append(EscapeCharacterClassLiteral(end)); diff --git a/tests/CodeIndex.Tests/FileIndexerTests.cs b/tests/CodeIndex.Tests/FileIndexerTests.cs index b9bb2b0c34..d4215c904f 100644 --- a/tests/CodeIndex.Tests/FileIndexerTests.cs +++ b/tests/CodeIndex.Tests/FileIndexerTests.cs @@ -2266,6 +2266,7 @@ public void ScanFilesDetailed_SkipsMalformedIgnoreRulesWithoutAborting() Assert.Equal(7, scanResult.Errors.Count); Assert.All(scanResult.Errors, error => Assert.Contains(".gitignore:", error.Path, StringComparison.Ordinal)); Assert.All(scanResult.Errors, error => Assert.Contains("Invalid ignore rule skipped", error.Message, StringComparison.Ordinal)); + Assert.Contains(scanResult.Errors, error => error.Message == "Invalid ignore rule skipped: reversed character class range"); Assert.All(scanResult.Errors, error => Assert.Equal(FileIndexer.ScanIssueSeverity.Warning, error.Severity)); } finally