Waterfall/BungeeCord-Patches/0021-Better-Decompression-Sanity.patch
Juan Cruz Linsalata 55bf1d1d68
Updated Upstream (BungeeCord) (#858)
Co-authored-by: linsaftw <linsaftw@users.noreply.github.com>
2025-02-25 17:14:53 +00:00

67 lines
3.1 KiB
Diff

From fe053c35a3ec0f28a3a3d3db36e307aa3838f6a2 Mon Sep 17 00:00:00 2001
From: Techcable <Techcable@techcable.net>
Date: Fri, 18 Mar 2016 10:53:24 -0700
Subject: [PATCH] Better Decompression Sanity
Fixes #40
diff --git a/proxy/src/main/java/net/md_5/bungee/compress/PacketDecompressor.java b/proxy/src/main/java/net/md_5/bungee/compress/PacketDecompressor.java
index 1612ffcf..7fa07031 100644
--- a/proxy/src/main/java/net/md_5/bungee/compress/PacketDecompressor.java
+++ b/proxy/src/main/java/net/md_5/bungee/compress/PacketDecompressor.java
@@ -1,5 +1,7 @@
package net.md_5.bungee.compress;
+import lombok.*;
+
import com.google.common.base.Preconditions;
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
@@ -9,10 +11,12 @@ import net.md_5.bungee.jni.zlib.BungeeZlib;
import net.md_5.bungee.protocol.DefinedPacket;
import net.md_5.bungee.protocol.OverflowPacketException;
+@RequiredArgsConstructor
public class PacketDecompressor extends MessageToMessageDecoder<ByteBuf>
{
private static final int MAX_DECOMPRESSED_LEN = 1 << 23;
+ private final int compressionThreshold;
private final BungeeZlib zlib = CompressFactory.zlib.newInstance();
@Override
@@ -40,14 +44,15 @@ public class PacketDecompressor extends MessageToMessageDecoder<ByteBuf>
{
throw new OverflowPacketException( "Packet may not be larger than " + MAX_DECOMPRESSED_LEN + " bytes" );
}
-
+
+ Preconditions.checkArgument( size >= compressionThreshold, "Decompressed size %s less than compression threshold %s", size, compressionThreshold);
// Do not use size as max capacity, as its possible that the entity rewriter increases the size afterwards
// This would result in a kick (it happens rarely as the entity ids size must differ)
ByteBuf decompressed = ctx.alloc().directBuffer( size, MAX_DECOMPRESSED_LEN );
try
{
zlib.process( in, decompressed );
- Preconditions.checkState( decompressed.readableBytes() == size, "Decompressed packet size mismatch" );
+ Preconditions.checkArgument( decompressed.readableBytes() == size, "Decompressed size %s is not equal to actual decompressed bytes", size, decompressed.readableBytes());
out.add( decompressed );
decompressed = null;
diff --git a/proxy/src/main/java/net/md_5/bungee/netty/ChannelWrapper.java b/proxy/src/main/java/net/md_5/bungee/netty/ChannelWrapper.java
index a3c6c8c4..909941d9 100644
--- a/proxy/src/main/java/net/md_5/bungee/netty/ChannelWrapper.java
+++ b/proxy/src/main/java/net/md_5/bungee/netty/ChannelWrapper.java
@@ -190,7 +190,7 @@ public class ChannelWrapper
if ( decompressor == null )
{
- addBefore( PipelineUtils.PACKET_DECODER, "decompress", decompressor = new PacketDecompressor() );
+ addBefore( PipelineUtils.PACKET_DECODER, "decompress", decompressor = new PacketDecompressor(compressionThreshold) );
}
} else
{
--
2.47.1.windows.2