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);