From 88436c44a65f7984c114546255eab3674f5b7406 Mon Sep 17 00:00:00 2001 From: FlorianMichael Date: Sun, 29 Jun 2025 21:45:47 +1000 Subject: [PATCH] #3854: Fix CustomClickAction read and write implementation --- .../md_5/bungee/protocol/DefinedPacket.java | 32 +++++++++++++++++++ .../net/md_5/bungee/protocol/TagUtil.java | 2 ++ .../protocol/packet/CustomClickAction.java | 9 ++---- 3 files changed, 36 insertions(+), 7 deletions(-) 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 0ee7b0de..1ccca2f0 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 @@ -48,6 +48,38 @@ public abstract class DefinedPacket } } + public T readLengthPrefixed(Function reader, ByteBuf buf, int maxSize) + { + int size = readVarInt( buf ); + + if ( size > maxSize ) + { + throw new OverflowPacketException( "Cannot read length prefixed with limit " + maxSize + " (got size of " + size + ")" ); + } + + return reader.apply( buf.readSlice( size ) ); + } + + public void writeLengthPrefixed(T value, BiConsumer writer, ByteBuf buf, int maxSize) + { + ByteBuf tempBuffer = buf.alloc().buffer(); + try + { + writer.accept( value, tempBuffer ); + + if ( tempBuffer.readableBytes() > maxSize ) + { + throw new OverflowPacketException( "Cannot write length prefixed with limit " + maxSize + " (got size of " + tempBuffer.readableBytes() + ")" ); + } + + writeVarInt( tempBuffer.readableBytes(), buf ); + buf.writeBytes( tempBuffer ); + } finally + { + tempBuffer.release(); + } + } + public static void writeString(String s, ByteBuf buf) { writeString( s, buf, Short.MAX_VALUE ); diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/TagUtil.java b/protocol/src/main/java/net/md_5/bungee/protocol/TagUtil.java index b942d10b..74b963eb 100644 --- a/protocol/src/main/java/net/md_5/bungee/protocol/TagUtil.java +++ b/protocol/src/main/java/net/md_5/bungee/protocol/TagUtil.java @@ -323,6 +323,8 @@ public final class TagUtil } return jsonLongArray; + case Tag.END: + return JsonNull.INSTANCE; default: throw new IllegalArgumentException( "Unknown NBT tag: " + tag ); } diff --git a/protocol/src/main/java/net/md_5/bungee/protocol/packet/CustomClickAction.java b/protocol/src/main/java/net/md_5/bungee/protocol/packet/CustomClickAction.java index 9aa1e409..b1bbd4a5 100644 --- a/protocol/src/main/java/net/md_5/bungee/protocol/packet/CustomClickAction.java +++ b/protocol/src/main/java/net/md_5/bungee/protocol/packet/CustomClickAction.java @@ -26,19 +26,14 @@ public class CustomClickAction extends DefinedPacket public void read(ByteBuf buf, Protocol protocol, ProtocolConstants.Direction direction, int protocolVersion) { id = readString( buf ); - data = readNullable( (buf0) -> (TypedTag) readTag( buf0, protocolVersion, new NBTLimiter( 32768L, 16 ) ), buf ); + data = readLengthPrefixed( (buf0) -> (TypedTag) readTag( buf0, protocolVersion, new NBTLimiter( 32768L, 16 ) ), buf, 65536 ); } @Override public void write(ByteBuf buf, Protocol protocol, ProtocolConstants.Direction direction, int protocolVersion) { writeString( id, buf ); - writeNullable( data, (data0, buf0) -> writeTag( data0, buf0, protocolVersion ), buf ); - } - - @Override - public void write(ByteBuf buf) - { + writeLengthPrefixed( data, (data0, buf0) -> writeTag( data0, buf0, protocolVersion ), buf, 65536 ); } @Override