Skip to content

Commit e7ed664

Browse files
committed
fix(networking): Prevent hanging the network loop if an exception occurs
1 parent af70de3 commit e7ed664

File tree

2 files changed

+18
-3
lines changed

2 files changed

+18
-3
lines changed

src/main/java/emu/grasscutter/net/impl/NetworkTransportImpl.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import emu.grasscutter.net.INetworkTransport;
44
import emu.grasscutter.server.game.GameSession;
5+
import emu.grasscutter.utils.Utils;
56
import io.netty.buffer.ByteBuf;
67
import io.netty.channel.DefaultEventLoop;
78
import io.netty.channel.EventLoop;
@@ -83,11 +84,20 @@ public void handleReceive(ByteBuf byteBuf, Ukcp ukcp) {
8384
return;
8485
}
8586

86-
transport.networkLoop.submit(() -> session.onReceived(byteBuf.array()));
87+
// Copy the buffer to avoid reference issues.
88+
var data = Utils.byteBufToArray(byteBuf);
89+
90+
transport.networkLoop.submit(() -> {
91+
// Fun fact: if we don't catch exceptions here,
92+
// we run the risk of locking the entire network loop.
93+
try {
94+
session.onReceived(data);
95+
} catch (Exception ex) {
96+
session.getLogger().warn("Unable to handle received data.", ex);
97+
}
98+
});
8799
} catch (Exception ex) {
88100
NetworkTransportImpl.log.warn("Unable to handle received data.", ex);
89-
} finally {
90-
byteBuf.release();
91101
}
92102
}
93103

src/main/java/emu/grasscutter/server/game/GameSession.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import io.netty.buffer.*;
1515
import java.net.InetSocketAddress;
1616
import lombok.*;
17+
import org.slf4j.Logger;
1718

1819
public class GameSession implements IGameSession {
1920
@Getter private final GameServer server;
@@ -49,6 +50,10 @@ public InetSocketAddress getAddress() {
4950
return this.session.getAddress();
5051
}
5152

53+
public Logger getLogger() {
54+
return this.session.getLogger();
55+
}
56+
5257
public synchronized void setPlayer(Player player) {
5358
this.player = player;
5459
this.player.setSession(this);

0 commit comments

Comments
 (0)