From e3078aa5aa0e70a5f22846cc048d6a5722a96535 Mon Sep 17 00:00:00 2001 From: Istvan Toth Date: Fri, 4 Oct 2019 15:13:03 +0200 Subject: [PATCH] HBASE-23119 ArrayIndexOutOfBoundsException in PrivateCellUtil#qualifierStartsWith (#688) Signed-off-by: Peter Somogyi Signed-off-by: Viraj Jasani --- .../org/apache/hadoop/hbase/filter/TestComparators.java | 8 ++++++++ .../java/org/apache/hadoop/hbase/PrivateCellUtil.java | 3 +++ 2 files changed, 11 insertions(+) diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/filter/TestComparators.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/filter/TestComparators.java index 7a4f97029ef..3835948b930 100644 --- a/hbase-client/src/test/java/org/apache/hadoop/hbase/filter/TestComparators.java +++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/filter/TestComparators.java @@ -18,6 +18,7 @@ package org.apache.hadoop.hbase.filter; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.nio.ByteBuffer; @@ -97,5 +98,12 @@ public class TestComparators { comparable = new SubstringComparator("cf"); assertEquals(0, PrivateCellUtil.compareFamily(bbCell, comparable)); assertEquals(0, PrivateCellUtil.compareFamily(kv, comparable)); + // Qualifier starts with + kv = new KeyValue(r1, f, q1, v2); + assertTrue(PrivateCellUtil.qualifierStartsWith(kv, Bytes.toBytes("q"))); + assertTrue(PrivateCellUtil.qualifierStartsWith(kv, q1)); + assertFalse(PrivateCellUtil.qualifierStartsWith(kv, q2)); + assertFalse(PrivateCellUtil.qualifierStartsWith(kv, Bytes.toBytes("longerthanthequalifier"))); } + } diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/PrivateCellUtil.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/PrivateCellUtil.java index 768ab006c1f..c26841dad1a 100644 --- a/hbase-common/src/main/java/org/apache/hadoop/hbase/PrivateCellUtil.java +++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/PrivateCellUtil.java @@ -767,6 +767,9 @@ public final class PrivateCellUtil { if (startsWith == null || startsWith.length == 0) { throw new IllegalArgumentException("Cannot pass an empty startsWith"); } + if (left.getQualifierLength() < startsWith.length) { + return false; + } if (left instanceof ByteBufferExtendedCell) { return ByteBufferUtils.equals(((ByteBufferExtendedCell) left).getQualifierByteBuffer(), ((ByteBufferExtendedCell) left).getQualifierPosition(), startsWith.length,