From 1cd07eb6820d14d1a1970d7c8c056d6ee1d39767 Mon Sep 17 00:00:00 2001 From: kashike Date: Wed, 20 Mar 2019 21:39:12 -0700 Subject: [PATCH] Use proper max length for serverbound chat packet diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/DefinedPacket.java b/protocol/src/main/java/net/md_5/bungee/protocol/DefinedPacket.java index 57155c3b..9951c1f9 100644 --- a/protocol/src/main/java/net/md_5/bungee/protocol/DefinedPacket.java +++ b/protocol/src/main/java/net/md_5/bungee/protocol/DefinedPacket.java @@ -37,6 +37,34 @@ public abstract class DefinedPacket return new String( b, Charsets.UTF_8 ); } + // Waterfall start + public static void writeString(String s, final int maxLength, ByteBuf buf) + { + if ( s.length() > maxLength ) + { + throw new OverflowPacketException( String.format( "Cannot send string longer than %s (got %s characters)", maxLength, s.length() ) ); + } + + byte[] b = s.getBytes( Charsets.UTF_8 ); + writeVarInt( b.length, buf ); + buf.writeBytes( b ); + } + + public static String readString(ByteBuf buf, final int maxLength) + { + int len = readVarInt( buf ); + if ( len > maxLength ) + { + throw new OverflowPacketException( String.format( "Cannot receive string longer than %s (got %s characters)", maxLength, len ) ); + } + + byte[] b = new byte[ len ]; + buf.readBytes( b ); + + return new String( b, Charsets.UTF_8 ); + } + // Waterfall end + public static void writeArray(byte[] b, ByteBuf buf) { if ( b.length > Short.MAX_VALUE ) diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/Chat.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/Chat.java index ffcd815c..0ded6739 100644 --- a/protocol/src/main/java/net/md_5/bungee/protocol/packet/Chat.java +++ b/protocol/src/main/java/net/md_5/bungee/protocol/packet/Chat.java @@ -27,6 +27,11 @@ public class Chat extends DefinedPacket @Override public void read(ByteBuf buf, ProtocolConstants.Direction direction, int protocolVersion) { + // Waterfall start + if (direction == ProtocolConstants.Direction.TO_CLIENT) { + this.message = readString(buf, Short.MAX_VALUE * 8 + 8); + } else + // Waterfall end message = readString( buf ); if ( direction == ProtocolConstants.Direction.TO_CLIENT ) { @@ -37,6 +42,11 @@ public class Chat extends DefinedPacket @Override public void write(ByteBuf buf, ProtocolConstants.Direction direction, int protocolVersion) { + // Waterfall start + if (direction == ProtocolConstants.Direction.TO_CLIENT) { + writeString(this.message, Short.MAX_VALUE * 8 + 8, buf); + } else + // Waterfall end writeString( message, buf ); if ( direction == ProtocolConstants.Direction.TO_CLIENT ) { -- 2.23.0