From 1739afa52870480965df5d188d671e9d760e55ac Mon Sep 17 00:00:00 2001 From: Jordan West Date: Thu, 26 Dec 2024 19:33:40 -0800 Subject: [PATCH] fix bug introduced in refactor when chunk.length >= maxCompressedLength --- .../cassandra/io/util/CompressedChunkReader.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/java/org/apache/cassandra/io/util/CompressedChunkReader.java b/src/java/org/apache/cassandra/io/util/CompressedChunkReader.java index e3a363250e26..9a4d549f6be5 100644 --- a/src/java/org/apache/cassandra/io/util/CompressedChunkReader.java +++ b/src/java/org/apache/cassandra/io/util/CompressedChunkReader.java @@ -282,7 +282,20 @@ public void readChunk(long position, ByteBuffer uncompressed) } else { - uncompressed.put(reader.read(chunk, shouldCheckCrc)); + uncompressed.position(0).limit(chunk.length); + if (channel.read(uncompressed, chunk.offset) != chunk.length) + throw new CorruptBlockException(channel.filePath(), chunk); + + if (shouldCheckCrc) + { + uncompressed.flip(); + int checksum = (int) ChecksumType.CRC32.of(uncompressed); + + ByteBuffer scratch = ByteBuffer.allocate(Integer.BYTES); + if (channel.read(scratch, chunk.offset + chunk.length) != Integer.BYTES + || scratch.getInt(0) != checksum) + throw new CorruptBlockException(channel.filePath(), chunk); + } } uncompressed.flip(); }