From 91b295ead5f22364cd50e6046effccd41ad21d29 Mon Sep 17 00:00:00 2001 From: Andrew Steinborn Date: Thu, 5 Nov 2020 17:22:19 -0500 Subject: [PATCH] Further improve the inflate overflow checks in the Java 11 compressor native This brings the Java compressor in line with our libdeflate one. Backport this from Velocity 2.0.0. --- .../natives/compression/Java11VelocityCompressor.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/native/src/main/java/com/velocitypowered/natives/compression/Java11VelocityCompressor.java b/native/src/main/java/com/velocitypowered/natives/compression/Java11VelocityCompressor.java index 685152d07..845c3adcd 100644 --- a/native/src/main/java/com/velocitypowered/natives/compression/Java11VelocityCompressor.java +++ b/native/src/main/java/com/velocitypowered/natives/compression/Java11VelocityCompressor.java @@ -66,7 +66,7 @@ public class Java11VelocityCompressor implements VelocityCompressor { final int origIdx = source.readerIndex(); INFLATE_SET_INPUT.invokeExact(inflater, source.nioBuffer()); - while (!inflater.finished() && inflater.getBytesRead() < source.readableBytes()) { + while (!inflater.finished() && inflater.getBytesWritten() < uncompressedSize) { if (!destination.isWritable()) { ensureMaxSize(destination, uncompressedSize); destination.ensureWritable(ZLIB_BUFFER_SIZE); @@ -78,13 +78,18 @@ public class Java11VelocityCompressor implements VelocityCompressor { destination.writerIndex(destination.writerIndex() + produced); } + if (inflater.getBytesWritten() != uncompressedSize) { + throw new DataFormatException("Did not write the exact expected number of" + + " uncompressed bytes, expected " + uncompressedSize); + } source.readerIndex(origIdx + inflater.getTotalIn()); - inflater.reset(); } catch (Throwable e) { if (e instanceof DataFormatException) { throw (DataFormatException) e; } throw new RuntimeException(e); + } finally { + inflater.reset(); } }