Repository: hbase
Updated Branches:
  refs/heads/branch-1 719f5465c -> 50ef066c8


HBASE-18921 Fix Result.current ArrayIndexOutOfBoundsException

Patch ArrayIndexOutOfBoundsException when current() is called after
advance() has already returned false

Signed-off-by: Chia-Ping Tsai <[email protected]>


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/50ef066c
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/50ef066c
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/50ef066c

Branch: refs/heads/branch-1
Commit: 50ef066c89d57f17ba51b04ba248e8c8c9ff3d8d
Parents: 719f546
Author: Maytee Chinavanichkit <[email protected]>
Authored: Mon Oct 2 15:19:25 2017 +0900
Committer: Chia-Ping Tsai <[email protected]>
Committed: Sun Oct 8 02:58:01 2017 +0800

----------------------------------------------------------------------
 .../org/apache/hadoop/hbase/client/Result.java    | 16 +++++++++++++---
 .../apache/hadoop/hbase/client/TestResult.java    | 18 ++++++++++++++++++
 2 files changed, 31 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/50ef066c/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Result.java
----------------------------------------------------------------------
diff --git 
a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Result.java 
b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Result.java
index 16b3624..ffd7695 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Result.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Result.java
@@ -30,6 +30,7 @@ import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.NavigableMap;
+import java.util.NoSuchElementException;
 import java.util.TreeMap;
 
 import org.apache.hadoop.hbase.Cell;
@@ -949,14 +950,23 @@ public class Result implements CellScannable, CellScanner 
{
 
   @Override
   public Cell current() {
-    if (cells == null) return null;
-    return (cellScannerIndex < 0)? null: this.cells[cellScannerIndex];
+    if (cells == null
+            || cellScannerIndex == INITIAL_CELLSCANNER_INDEX
+            || cellScannerIndex >= cells.length)
+      return null;
+    return this.cells[cellScannerIndex];
   }
 
   @Override
   public boolean advance() {
     if (cells == null) return false;
-    return ++cellScannerIndex < this.cells.length;
+    cellScannerIndex++;
+    if (cellScannerIndex < this.cells.length) {
+      return true;
+    } else if (cellScannerIndex == this.cells.length) {
+      return false;
+    }
+    throw new NoSuchElementException("Cannot advance beyond the last cell");
   }
 
   public Boolean getExists() {

http://git-wip-us.apache.org/repos/asf/hbase/blob/50ef066c/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestResult.java
----------------------------------------------------------------------
diff --git 
a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestResult.java 
b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestResult.java
index d9496b3..5e73be3 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestResult.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestResult.java
@@ -25,6 +25,7 @@ import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.Arrays;
 import java.util.List;
+import java.util.NoSuchElementException;
 
 import junit.framework.TestCase;
 
@@ -105,6 +106,23 @@ public class TestResult extends TestCase {
     }
   }
 
+  public void testCurrentOnEmptyCell() throws IOException {
+    Result r = Result.create(new Cell[0]);
+    assertFalse(r.advance());
+    assertNull(r.current());
+  }
+
+  public void testAdvanceTwiceOnEmptyCell() throws IOException {
+    Result r = Result.create(new Cell[0]);
+    assertFalse(r.advance());
+    try {
+      r.advance();
+      fail("NoSuchElementException should have been thrown!");
+    } catch (NoSuchElementException ex) {
+      LOG.debug("As expected: " + ex.getMessage());
+    }
+  }
+
   public void testMultiVersionGetColumn() throws Exception {
     KeyValue [] kvs1 = genKVs(row, family, value, 1, 100);
     KeyValue [] kvs2 = genKVs(row, family, value, 200, 100);

Reply via email to