Skip to content

Commit

Permalink
ARTEMIS-1810 JDBCSequentialFileFactoryDriver should check <=0 read le…
Browse files Browse the repository at this point in the history
…ngth

In order to avoid out of bounds reads to happen, the reading of the file
should avoid those readings to hit the DMBS and just return the expected
value.
  • Loading branch information
franz1981 authored and clebertsuconic committed Apr 17, 2018
1 parent 95e9e6e commit 3d30a98
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 6 deletions.
Expand Up @@ -294,17 +294,27 @@ public int readFromFile(JDBCSequentialFile file, ByteBuffer bytes) throws SQLExc
if (rs.next()) {
final Blob blob = rs.getBlob(1);
if (blob != null) {
readLength = (int) calculateReadLength(blob.length(), bytes.remaining(), file.position());
byte[] data = blob.getBytes(file.position() + 1, readLength);
bytes.put(data);
final long blobLength = blob.length();
final int bytesRemaining = bytes.remaining();
final long filePosition = file.position();
readLength = (int) calculateReadLength(blobLength, bytesRemaining, filePosition);
if (logger.isDebugEnabled()) {
logger.debugf("trying read %d bytes: blobLength = %d bytesRemaining = %d filePosition = %d",
readLength, blobLength, bytesRemaining, filePosition);
}
if (readLength < 0) {
readLength = -1;
} else if (readLength > 0) {
byte[] data = blob.getBytes(file.position() + 1, readLength);
bytes.put(data);
}
}
}
connection.commit();
return readLength;
} catch (Throwable e) {
throw e;
} finally {
} catch (SQLException e) {
connection.rollback();
throw e;
}
}
}
Expand Down
Expand Up @@ -96,6 +96,66 @@ public void testJDBCFileFactoryStarted() throws Exception {
assertTrue(factory.isStarted());
}

@Test
public void testReadZeroBytesOnEmptyFile() throws Exception {
JDBCSequentialFile file = (JDBCSequentialFile) factory.createSequentialFile("test.txt");
file.open();
try {
final ByteBuffer readBuffer = ByteBuffer.allocate(0);
final int bytes = file.read(readBuffer);
assertEquals(0, bytes);
} finally {
file.close();
}
}

@Test
public void testReadZeroBytesOnNotEmptyFile() throws Exception {
final int fileLength = 8;
JDBCSequentialFile file = (JDBCSequentialFile) factory.createSequentialFile("test.txt");
file.open();
try {
file.writeDirect(ByteBuffer.allocate(fileLength), true);
assertEquals(fileLength, file.size());
final ByteBuffer readBuffer = ByteBuffer.allocate(0);
final int bytes = file.read(readBuffer);
assertEquals(0, bytes);
} finally {
file.close();
}
}

@Test
public void testReadOutOfBoundsOnEmptyFile() throws Exception {
JDBCSequentialFile file = (JDBCSequentialFile) factory.createSequentialFile("test.txt");
file.open();
try {
final ByteBuffer readBuffer = ByteBuffer.allocate(1);
file.position(1);
final int bytes = file.read(readBuffer);
assertTrue("bytes read should be < 0", bytes < 0);
} finally {
file.close();
}
}

@Test
public void testReadOutOfBoundsOnNotEmptyFile() throws Exception {
final int fileLength = 8;
JDBCSequentialFile file = (JDBCSequentialFile) factory.createSequentialFile("test.txt");
file.open();
try {
file.writeDirect(ByteBuffer.allocate(fileLength), true);
assertEquals(fileLength, file.size());
file.position(fileLength + 1);
final ByteBuffer readBuffer = ByteBuffer.allocate(fileLength);
final int bytes = file.read(readBuffer);
assertTrue("bytes read should be < 0", bytes < 0);
} finally {
file.close();
}
}

@Test
public void testCreateFiles() throws Exception {
int noFiles = 100;
Expand Down

0 comments on commit 3d30a98

Please sign in to comment.