mirror of
https://github.com/PaperMC/Waterfall.git
synced 2025-02-26 08:41:28 +01:00
67 lines
3.1 KiB
Diff
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
|
|
|