From bd2bb6325ef88ef06b4adc4a62eff9d23d25e96d Mon Sep 17 00:00:00 2001 From: Shane Freeder Date: Thu, 17 Apr 2025 18:59:49 +0100 Subject: [PATCH] Validate state transition --- .../velocitypowered/proxy/connection/MinecraftConnection.java | 1 + .../proxy/connection/client/ClientPlaySessionHandler.java | 4 ++++ .../proxy/connection/client/ConnectedPlayer.java | 1 + 3 files changed, 6 insertions(+) diff --git a/proxy/src/main/java/com/velocitypowered/proxy/connection/MinecraftConnection.java b/proxy/src/main/java/com/velocitypowered/proxy/connection/MinecraftConnection.java index c9173907..3f34a54c 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/connection/MinecraftConnection.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/connection/MinecraftConnection.java @@ -84,6 +84,7 @@ public class MinecraftConnection extends ChannelInboundHandlerAdapter { private static final Logger logger = LogManager.getLogger(MinecraftConnection.class); private final Channel channel; + public boolean pendingConfigurationSwitch = false; private SocketAddress remoteAddress; private StateRegistry state; private Map sessionHandlers; diff --git a/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ClientPlaySessionHandler.java b/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ClientPlaySessionHandler.java index adaeb337..10b837fa 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ClientPlaySessionHandler.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ClientPlaySessionHandler.java @@ -72,6 +72,7 @@ import com.velocitypowered.proxy.protocol.packet.config.FinishedUpdatePacket; import com.velocitypowered.proxy.protocol.packet.title.GenericTitlePacket; import com.velocitypowered.proxy.protocol.util.PluginMessageUtil; import com.velocitypowered.proxy.util.CharacterUtil; +import com.velocitypowered.proxy.util.except.QuietRuntimeException; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufUtil; import io.netty.buffer.Unpooled; @@ -392,6 +393,9 @@ public class ClientPlaySessionHandler implements MinecraftSessionHandler { @Override public boolean handle(FinishedUpdatePacket packet) { + if (!player.getConnection().pendingConfigurationSwitch) { + throw new QuietRuntimeException("Not expecting reconfiguration"); + } // Complete client switch player.getConnection().setActiveSessionHandler(StateRegistry.CONFIG); VelocityServerConnection serverConnection = player.getConnectedServer(); diff --git a/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ConnectedPlayer.java b/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ConnectedPlayer.java index 982b9652..22e1dc9c 100644 --- a/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ConnectedPlayer.java +++ b/proxy/src/main/java/com/velocitypowered/proxy/connection/client/ConnectedPlayer.java @@ -1318,6 +1318,7 @@ public class ConnectedPlayer implements MinecraftConnectionAssociation, Player, connection.write(BundleDelimiterPacket.INSTANCE); } connection.write(StartUpdatePacket.INSTANCE); + connection.pendingConfigurationSwitch = true; connection.getChannel().pipeline().get(MinecraftEncoder.class).setState(StateRegistry.CONFIG); // Make sure we don't send any play packets to the player after update start connection.addPlayPacketQueueHandler();