fix(battle-node): harden SIO parse + narrow Matched OppoId/Seed to int
#3: SocketIoFrame.Parse now range-checks the packet type char (was unchecked cast — any char outside 0-6 produced an undefined enum value) and uses int.TryParse for ack-id (was int.Parse — a >10-digit ack-id threw OverflowException, tearing down the WS mid-game). Both now throw ArgumentException consistently. The read loop in RealParticipant wraps both EIO and SIO parse calls with try-catch so a malformed frame is logged and skipped instead of killing the battle. #4: MatchedSelfInfo/MatchedOppoInfo OppoId and Seed narrowed from long to int. The client reads both with Convert.ToInt32 inside a swallowing try/catch — any value > int.MaxValue silently dropped the Matched event, preventing the battle from starting. Seed was already int-range (BattleSeeds.Stable returns int); OppoId (viewer ID) is ~847M in captures, well under int.MaxValue. The narrowing cast now happens explicitly in ServerBattleFrames.BuildMatched at the wire boundary. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -134,7 +134,15 @@ public sealed class RealParticipant : IBattleParticipant, IHasHandshakePhase
|
||||
{
|
||||
var text = Encoding.UTF8.GetString(msg.Value.Bytes);
|
||||
if (text.Length == 0) continue;
|
||||
var eio = EngineIoFrame.Parse(text);
|
||||
|
||||
EngineIoFrame eio;
|
||||
try { eio = EngineIoFrame.Parse(text); }
|
||||
catch (ArgumentException ex)
|
||||
{
|
||||
_log.LogWarning(ex, "Dropping unparseable EIO frame from viewer {Vid}", ViewerId);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (_diagnosticLogging)
|
||||
{
|
||||
_log.LogInformation(
|
||||
@@ -149,7 +157,13 @@ public sealed class RealParticipant : IBattleParticipant, IHasHandshakePhase
|
||||
}
|
||||
if (eio.Type != EngineIoPacketType.Message) continue;
|
||||
|
||||
var sio = SocketIoFrame.Parse(eio.Payload);
|
||||
SocketIoFrame sio;
|
||||
try { sio = SocketIoFrame.Parse(eio.Payload); }
|
||||
catch (ArgumentException ex)
|
||||
{
|
||||
_log.LogWarning(ex, "Dropping unparseable SIO frame from viewer {Vid}", ViewerId);
|
||||
continue;
|
||||
}
|
||||
if (sio.AttachmentCount > 0)
|
||||
{
|
||||
pendingFrame = sio;
|
||||
|
||||
Reference in New Issue
Block a user