You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by kr...@apache.org on 2022/04/25 20:02:40 UTC
[lucene] branch branch_9x updated: LUCENE-10533: SpellChecker.formGrams is missing bounds check (#836)
This is an automated email from the ASF dual-hosted git repository.
krisden pushed a commit to branch branch_9x
in repository https://gitbox.apache.org/repos/asf/lucene.git
The following commit(s) were added to refs/heads/branch_9x by this push:
new 4ddcd8a98da LUCENE-10533: SpellChecker.formGrams is missing bounds check (#836)
4ddcd8a98da is described below
commit 4ddcd8a98da0d608ff5ddbeab5564f2c84a715d1
Author: Kevin Risden <ri...@users.noreply.github.com>
AuthorDate: Mon Apr 25 15:55:50 2022 -0400
LUCENE-10533: SpellChecker.formGrams is missing bounds check (#836)
---
lucene/CHANGES.txt | 2 ++
.../org/apache/lucene/search/spell/SpellChecker.java | 5 ++++-
.../lucene/search/spell/TestLuceneDictionary.java | 4 +++-
.../lucene/search/spell/TestPlainTextDictionary.java | 4 +++-
.../apache/lucene/search/spell/TestSpellChecker.java | 18 ++++++++++++++++++
5 files changed, 30 insertions(+), 3 deletions(-)
diff --git a/lucene/CHANGES.txt b/lucene/CHANGES.txt
index 767a79aac00..dbfe94749d1 100644
--- a/lucene/CHANGES.txt
+++ b/lucene/CHANGES.txt
@@ -88,6 +88,8 @@ Bug Fixes
* LUCENE-10495: Fix return statement of siblingsLoaded() in TaxonomyFacets. (Yuting Gan)
+* LUCENE-10533: SpellChecker.formGrams is missing bounds check (Kevin Risden)
+
Build
---------------------
diff --git a/lucene/suggest/src/java/org/apache/lucene/search/spell/SpellChecker.java b/lucene/suggest/src/java/org/apache/lucene/search/spell/SpellChecker.java
index 1aee0ab8174..be0ad317f32 100644
--- a/lucene/suggest/src/java/org/apache/lucene/search/spell/SpellChecker.java
+++ b/lucene/suggest/src/java/org/apache/lucene/search/spell/SpellChecker.java
@@ -426,6 +426,9 @@ public class SpellChecker implements java.io.Closeable {
*/
private static String[] formGrams(String text, int ng) {
int len = text.length();
+ if (len < ng) {
+ return new String[] {};
+ }
String[] res = new String[len - ng + 1];
for (int i = 0; i < len - ng + 1; i++) {
res[i] = text.substring(i, i + ng);
@@ -559,7 +562,7 @@ public class SpellChecker implements java.io.Closeable {
if (l == 5) {
return 3;
}
- return 2;
+ return Math.min(l, 2);
}
private static Document createDocument(String text, int ng1, int ng2) {
diff --git a/lucene/suggest/src/test/org/apache/lucene/search/spell/TestLuceneDictionary.java b/lucene/suggest/src/test/org/apache/lucene/search/spell/TestLuceneDictionary.java
index b4a47b2063a..a7bed485926 100644
--- a/lucene/suggest/src/test/org/apache/lucene/search/spell/TestLuceneDictionary.java
+++ b/lucene/suggest/src/test/org/apache/lucene/search/spell/TestLuceneDictionary.java
@@ -187,7 +187,9 @@ public class TestLuceneDictionary extends LuceneTestCase {
indexReader = DirectoryReader.open(store);
sc.indexDictionary(
new LuceneDictionary(indexReader, "contents"), newIndexWriterConfig(null), false);
- String[] suggestions = sc.suggestSimilar("Tam", 1);
+ String[] suggestions = sc.suggestSimilar("", 1);
+ assertEquals(0, suggestions.length);
+ suggestions = sc.suggestSimilar("Tam", 1);
assertEquals(1, suggestions.length);
assertEquals("Tom", suggestions[0]);
suggestions = sc.suggestSimilar("Jarry", 1);
diff --git a/lucene/suggest/src/test/org/apache/lucene/search/spell/TestPlainTextDictionary.java b/lucene/suggest/src/test/org/apache/lucene/search/spell/TestPlainTextDictionary.java
index 592bb09b304..2c9ab3f2622 100644
--- a/lucene/suggest/src/test/org/apache/lucene/search/spell/TestPlainTextDictionary.java
+++ b/lucene/suggest/src/test/org/apache/lucene/search/spell/TestPlainTextDictionary.java
@@ -31,7 +31,9 @@ public class TestPlainTextDictionary extends LuceneTestCase {
Directory ramDir = newDirectory();
SpellChecker spellChecker = new SpellChecker(ramDir);
spellChecker.indexDictionary(ptd, newIndexWriterConfig(null), false);
- String[] similar = spellChecker.suggestSimilar("treeword", 2);
+ String[] similar = spellChecker.suggestSimilar("", 2);
+ assertEquals(0, similar.length);
+ similar = spellChecker.suggestSimilar("treeword", 2);
assertEquals(2, similar.length);
assertEquals(similar[0], "threeword");
assertEquals(similar[1], "oneword");
diff --git a/lucene/suggest/src/test/org/apache/lucene/search/spell/TestSpellChecker.java b/lucene/suggest/src/test/org/apache/lucene/search/spell/TestSpellChecker.java
index 8e07539107c..7028a02a28f 100644
--- a/lucene/suggest/src/test/org/apache/lucene/search/spell/TestSpellChecker.java
+++ b/lucene/suggest/src/test/org/apache/lucene/search/spell/TestSpellChecker.java
@@ -194,6 +194,12 @@ public class TestSpellChecker extends LuceneTestCase {
spellChecker.clearIndex();
addwords(r, spellChecker, "field1");
+ {
+ String[] similar =
+ spellChecker.suggestSimilar("", 2, r, "field1", SuggestMode.SUGGEST_WHEN_NOT_IN_INDEX);
+ assertEquals(0, similar.length);
+ }
+
{
String[] similar =
spellChecker.suggestSimilar(
@@ -210,6 +216,12 @@ public class TestSpellChecker extends LuceneTestCase {
assertEquals("eight", similar[0]);
}
+ {
+ String[] similar =
+ spellChecker.suggestSimilar("", 5, r, "field1", SuggestMode.SUGGEST_MORE_POPULAR);
+ assertEquals(0, similar.length);
+ }
+
{
String[] similar =
spellChecker.suggestSimilar("eighty", 5, r, "field1", SuggestMode.SUGGEST_MORE_POPULAR);
@@ -230,6 +242,12 @@ public class TestSpellChecker extends LuceneTestCase {
assertEquals(0, similar.length);
}
+ {
+ String[] similar =
+ spellChecker.suggestSimilar("", 5, r, "field1", SuggestMode.SUGGEST_ALWAYS);
+ assertEquals(0, similar.length);
+ }
+
{
String[] similar =
spellChecker.suggestSimilar("eighty", 5, r, "field1", SuggestMode.SUGGEST_ALWAYS);