Fix race condition in PacketListener
The ChannelHandlerContext was only set on the next received packet, however `save` could be called before that happened.
This commit is contained in:
@@ -153,8 +153,9 @@ public class ConnectionEventHandler {
|
|||||||
metaData.setGenerator("ReplayMod v" + ReplayMod.instance.getVersion());
|
metaData.setGenerator("ReplayMod v" + ReplayMod.instance.getVersion());
|
||||||
metaData.setDate(System.currentTimeMillis());
|
metaData.setDate(System.currentTimeMillis());
|
||||||
metaData.setMcVersion(ReplayMod.instance.getMinecraftVersion());
|
metaData.setMcVersion(ReplayMod.instance.getMinecraftVersion());
|
||||||
packetListener = new PacketListener(core, outputPath, replayFile, metaData);
|
|
||||||
Channel channel = ((NetworkManagerAccessor) networkManager).getChannel();
|
Channel channel = ((NetworkManagerAccessor) networkManager).getChannel();
|
||||||
|
packetListener = new PacketListener(core, channel, outputPath, replayFile, metaData);
|
||||||
if (channel.pipeline().get(PacketListener.DECODER_KEY) != null) {
|
if (channel.pipeline().get(PacketListener.DECODER_KEY) != null) {
|
||||||
// Regular channel, we'll inject our recorder directly before the decoder
|
// Regular channel, we'll inject our recorder directly before the decoder
|
||||||
channel.pipeline().addBefore(PacketListener.DECODER_KEY, PacketListener.RAW_RECORDER_KEY, packetListener);
|
channel.pipeline().addBefore(PacketListener.DECODER_KEY, PacketListener.RAW_RECORDER_KEY, packetListener);
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import com.replaymod.replaystudio.replay.ReplayMetaData;
|
|||||||
import de.johni0702.minecraft.gui.container.VanillaGuiScreen;
|
import de.johni0702.minecraft.gui.container.VanillaGuiScreen;
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
import io.netty.buffer.Unpooled;
|
import io.netty.buffer.Unpooled;
|
||||||
|
import io.netty.channel.Channel;
|
||||||
import io.netty.channel.ChannelHandler;
|
import io.netty.channel.ChannelHandler;
|
||||||
import io.netty.channel.ChannelHandlerContext;
|
import io.netty.channel.ChannelHandlerContext;
|
||||||
import io.netty.channel.ChannelInboundHandlerAdapter;
|
import io.netty.channel.ChannelInboundHandlerAdapter;
|
||||||
@@ -102,7 +103,7 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
|
|||||||
|
|
||||||
private ReplayMetaData metaData;
|
private ReplayMetaData metaData;
|
||||||
|
|
||||||
private ChannelHandlerContext context = null;
|
private final Channel channel;
|
||||||
private Packet currentRawPacket;
|
private Packet currentRawPacket;
|
||||||
|
|
||||||
private final long startTime;
|
private final long startTime;
|
||||||
@@ -116,8 +117,9 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
|
|||||||
*/
|
*/
|
||||||
private final AtomicInteger lastSaveMetaDataId = new AtomicInteger();
|
private final AtomicInteger lastSaveMetaDataId = new AtomicInteger();
|
||||||
|
|
||||||
public PacketListener(ReplayMod core, Path outputPath, ReplayFile replayFile, ReplayMetaData metaData) throws IOException {
|
public PacketListener(ReplayMod core, Channel channel, Path outputPath, ReplayFile replayFile, ReplayMetaData metaData) throws IOException {
|
||||||
this.core = core;
|
this.core = core;
|
||||||
|
this.channel = channel;
|
||||||
this.outputPath = outputPath;
|
this.outputPath = outputPath;
|
||||||
this.replayFile = replayFile;
|
this.replayFile = replayFile;
|
||||||
this.metaData = metaData;
|
this.metaData = metaData;
|
||||||
@@ -309,15 +311,6 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
|
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
|
||||||
if(ctx == null) {
|
|
||||||
if(context == null) {
|
|
||||||
return;
|
|
||||||
} else {
|
|
||||||
ctx = context;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.context = ctx;
|
|
||||||
|
|
||||||
NetworkState connectionState = getConnectionState();
|
NetworkState connectionState = getConnectionState();
|
||||||
|
|
||||||
Packet packet = null;
|
Packet packet = null;
|
||||||
@@ -367,16 +360,12 @@ public class PacketListener extends ChannelInboundHandlerAdapter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private NetworkState getConnectionState() {
|
private NetworkState getConnectionState() {
|
||||||
ChannelHandlerContext ctx = context;
|
|
||||||
if (ctx == null) {
|
|
||||||
return NetworkState.LOGIN;
|
|
||||||
}
|
|
||||||
//#if MC>=12002
|
//#if MC>=12002
|
||||||
//$$ AttributeKey<NetworkState.PacketHandler<?>> key = ClientConnection.CLIENTBOUND_PROTOCOL_KEY;
|
//$$ AttributeKey<NetworkState.PacketHandler<?>> key = ClientConnection.CLIENTBOUND_PROTOCOL_KEY;
|
||||||
//$$ return ctx.channel().attr(key).get().getState();
|
//$$ return channel.attr(key).get().getState();
|
||||||
//#else
|
//#else
|
||||||
AttributeKey<NetworkState> key = ClientConnection.ATTR_KEY_PROTOCOL;
|
AttributeKey<NetworkState> key = ClientConnection.ATTR_KEY_PROTOCOL;
|
||||||
return ctx.channel().attr(key).get();
|
return channel.attr(key).get();
|
||||||
//#endif
|
//#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user