HADOOP-11040. Return value of read(ByteBuffer buf) in CryptoInputStream is incorrect in some cases. (Yi Liu via wang)

This commit is contained in:
Andrew Wang 2014-09-17 17:58:56 -07:00
parent 123f20d42f
commit 47e5e19831
3 changed files with 27 additions and 5 deletions

View File

@ -732,6 +732,9 @@ Release 2.6.0 - UNRELEASED
HDFS-7075. hadoop-fuse-dfs fails because it cannot find HDFS-7075. hadoop-fuse-dfs fails because it cannot find
JavaKeyStoreProvider$Factory (cmccabe) JavaKeyStoreProvider$Factory (cmccabe)
HADOOP-11040. Return value of read(ByteBuffer buf) in CryptoInputStream is
incorrect in some cases. (Yi Liu via wang)
BREAKDOWN OF HDFS-6134 AND HADOOP-10150 SUBTASKS AND RELATED JIRAS BREAKDOWN OF HDFS-6134 AND HADOOP-10150 SUBTASKS AND RELATED JIRAS
HADOOP-10734. Implement high-performance secure random number sources. HADOOP-10734. Implement high-performance secure random number sources.

View File

@ -471,7 +471,16 @@ public class CryptoInputStream extends FilterInputStream implements
streamOffset += n; // Read n bytes streamOffset += n; // Read n bytes
decrypt(buf, n, pos); decrypt(buf, n, pos);
} }
return n;
if (n >= 0) {
return unread + n;
} else {
if (unread == 0) {
return -1;
} else {
return unread;
}
}
} }
throw new UnsupportedOperationException("ByteBuffer read unsupported " + throw new UnsupportedOperationException("ByteBuffer read unsupported " +

View File

@ -469,6 +469,7 @@ public abstract class CryptoStreamsTestBase {
int bufPos) throws Exception { int bufPos) throws Exception {
buf.position(bufPos); buf.position(bufPos);
int n = ((ByteBufferReadable) in).read(buf); int n = ((ByteBufferReadable) in).read(buf);
Assert.assertEquals(bufPos + n, buf.position());
byte[] readData = new byte[n]; byte[] readData = new byte[n];
buf.rewind(); buf.rewind();
buf.position(bufPos); buf.position(bufPos);
@ -568,6 +569,7 @@ public abstract class CryptoStreamsTestBase {
// Read forward len1 // Read forward len1
ByteBuffer buf = ByteBuffer.allocate(len1); ByteBuffer buf = ByteBuffer.allocate(len1);
int nRead = ((ByteBufferReadable) in).read(buf); int nRead = ((ByteBufferReadable) in).read(buf);
Assert.assertEquals(nRead, buf.position());
readData = new byte[nRead]; readData = new byte[nRead];
buf.rewind(); buf.rewind();
buf.get(readData); buf.get(readData);
@ -575,9 +577,10 @@ public abstract class CryptoStreamsTestBase {
System.arraycopy(data, (int)pos, expectedData, 0, nRead); System.arraycopy(data, (int)pos, expectedData, 0, nRead);
Assert.assertArrayEquals(readData, expectedData); Assert.assertArrayEquals(readData, expectedData);
// Pos should be len1 + 2 * len2 + nRead long lastPos = pos;
// Pos should be lastPos + nRead
pos = ((Seekable) in).getPos(); pos = ((Seekable) in).getPos();
Assert.assertEquals(len1 + 2 * len2 + nRead, pos); Assert.assertEquals(lastPos + nRead, pos);
// Pos: 1/3 dataLen // Pos: 1/3 dataLen
positionedReadCheck(in , dataLen / 3); positionedReadCheck(in , dataLen / 3);
@ -589,13 +592,15 @@ public abstract class CryptoStreamsTestBase {
System.arraycopy(data, (int)pos, expectedData, 0, len1); System.arraycopy(data, (int)pos, expectedData, 0, len1);
Assert.assertArrayEquals(readData, expectedData); Assert.assertArrayEquals(readData, expectedData);
// Pos should be 2 * len1 + 2 * len2 + nRead lastPos = pos;
// Pos should be lastPos + len1
pos = ((Seekable) in).getPos(); pos = ((Seekable) in).getPos();
Assert.assertEquals(2 * len1 + 2 * len2 + nRead, pos); Assert.assertEquals(lastPos + len1, pos);
// Read forward len1 // Read forward len1
buf = ByteBuffer.allocate(len1); buf = ByteBuffer.allocate(len1);
nRead = ((ByteBufferReadable) in).read(buf); nRead = ((ByteBufferReadable) in).read(buf);
Assert.assertEquals(nRead, buf.position());
readData = new byte[nRead]; readData = new byte[nRead];
buf.rewind(); buf.rewind();
buf.get(readData); buf.get(readData);
@ -603,6 +608,11 @@ public abstract class CryptoStreamsTestBase {
System.arraycopy(data, (int)pos, expectedData, 0, nRead); System.arraycopy(data, (int)pos, expectedData, 0, nRead);
Assert.assertArrayEquals(readData, expectedData); Assert.assertArrayEquals(readData, expectedData);
lastPos = pos;
// Pos should be lastPos + nRead
pos = ((Seekable) in).getPos();
Assert.assertEquals(lastPos + nRead, pos);
// ByteBuffer read after EOF // ByteBuffer read after EOF
((Seekable) in).seek(dataLen); ((Seekable) in).seek(dataLen);
buf.clear(); buf.clear();