HBASE-9893 Incorrect assert condition in OrderedBytes decoding
Correct an invalid assumption in remaining assertion code around OrderedBytes#decodeVarBlob. When an encoded value contains a 1-bit in its LSB position and the length of the encoded byte array is divisible by 7, the value remaining in variable t will be 0x80, resulting in the failed assertion coming out of the decoding loop. This patch preserves the assertion for the general case by resetting 't' at the conclusion of the 7-byte cycle. git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1543699 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
560f000424
commit
da89846cf7
|
@ -1109,6 +1109,9 @@ public class OrderedBytes {
|
|||
if (s == 7) {
|
||||
ret.put((byte) (t | (ord.apply(a[offset + i]) & 0x7f)));
|
||||
i++;
|
||||
// explicitly reset t -- clean up overflow buffer after decoding
|
||||
// a full cycle and retain assertion condition below. This happens
|
||||
t = 0; // when the LSB in the last encoded byte is 1. (HBASE-9893)
|
||||
} else {
|
||||
ret.put((byte) (t | ((ord.apply(a[offset + i]) & 0x7f) >>> s)));
|
||||
}
|
||||
|
|
|
@ -871,10 +871,20 @@ public class TestOrderedBytes {
|
|||
public void testBlobVar() {
|
||||
byte[][] vals =
|
||||
{ "".getBytes(), "foo".getBytes(), "foobarbazbub".getBytes(),
|
||||
{ (byte) 0xaa, (byte) 0xaa, (byte) 0xaa, (byte) 0xaa, (byte) 0xaa, (byte) 0xaa,
|
||||
(byte) 0xaa, /* 7 bytes of alternating bits; testing around HBASE-9893 */ },
|
||||
{ (byte) 0xaa, (byte) 0xaa, (byte) 0xaa, (byte) 0xaa, (byte) 0xaa, (byte) 0xaa,
|
||||
(byte) 0xaa, (byte) 0xaa, (byte) 0xaa, (byte) 0xaa, (byte) 0xaa, (byte) 0xaa },
|
||||
{ (byte) 0xaa, (byte) 0xaa, (byte) 0xaa, (byte) 0xaa, (byte) 0xaa, (byte) 0xaa,
|
||||
(byte) 0xaa, (byte) 0xaa, (byte) 0xaa, (byte) 0xaa, (byte) 0xaa, (byte) 0xaa,
|
||||
(byte) 0xaa, (byte) 0xaa, /* 14 bytes of alternating bits; testing around HBASE-9893 */ },
|
||||
{ (byte) 0x55, (byte) 0x55, (byte) 0x55, (byte) 0x55, (byte) 0x55, (byte) 0x55,
|
||||
(byte) 0x55, /* 7 bytes of alternating bits; testing around HBASE-9893 */ },
|
||||
{ (byte) 0x55, (byte) 0x55, (byte) 0x55, (byte) 0x55, (byte) 0x55, (byte) 0x55,
|
||||
(byte) 0x55, (byte) 0x55, (byte) 0x55, (byte) 0x55, (byte) 0x55, (byte) 0x55 },
|
||||
{ (byte) 0x55, (byte) 0x55, (byte) 0x55, (byte) 0x55, (byte) 0x55, (byte) 0x55,
|
||||
(byte) 0x55, (byte) 0x55, (byte) 0x55, (byte) 0x55, (byte) 0x55, (byte) 0x55,
|
||||
(byte) 0x55, (byte) 0x55, /* 14 bytes of alternating bits; testing around HBASE-9893 */ },
|
||||
"1".getBytes(), "22".getBytes(), "333".getBytes(), "4444".getBytes(),
|
||||
"55555".getBytes(), "666666".getBytes(), "7777777".getBytes(), "88888888".getBytes()
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue