fix(stage): add timeout to WaitStageBinary handler

Cherry-picked from main (c539905).
Prevents infinite loop when stage binary data never arrives by
limiting to 10 iterations (10 seconds) before returning empty response.
This commit is contained in:
Houmgaor
2026-01-30 01:02:43 +01:00
parent 355c2c01cc
commit a66b15d6c8

View File

@@ -376,7 +376,7 @@ func handleMsgSysWaitStageBinary(s *Session, p mhfpacket.MHFPacket) {
doAckBufSucceed(s, pkt.AckHandle, []byte{0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}) doAckBufSucceed(s, pkt.AckHandle, []byte{0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00})
return return
} }
for { for i := 0; i < 10; i++ {
s.logger.Debug("MsgSysWaitStageBinary before lock and get stage") s.logger.Debug("MsgSysWaitStageBinary before lock and get stage")
stage.Lock() stage.Lock()
stageBinary, gotBinary := stage.rawBinaryData[stageBinaryKey{pkt.BinaryType0, pkt.BinaryType1}] stageBinary, gotBinary := stage.rawBinaryData[stageBinaryKey{pkt.BinaryType0, pkt.BinaryType1}]
@@ -384,13 +384,15 @@ func handleMsgSysWaitStageBinary(s *Session, p mhfpacket.MHFPacket) {
s.logger.Debug("MsgSysWaitStageBinary after lock and get stage") s.logger.Debug("MsgSysWaitStageBinary after lock and get stage")
if gotBinary { if gotBinary {
doAckBufSucceed(s, pkt.AckHandle, stageBinary) doAckBufSucceed(s, pkt.AckHandle, stageBinary)
break return
} else { } else {
s.logger.Debug("Waiting stage binary", zap.Uint8("BinaryType0", pkt.BinaryType0), zap.Uint8("pkt.BinaryType1", pkt.BinaryType1)) s.logger.Debug("Waiting stage binary", zap.Uint8("BinaryType0", pkt.BinaryType0), zap.Uint8("pkt.BinaryType1", pkt.BinaryType1))
time.Sleep(1 * time.Second) time.Sleep(1 * time.Second)
continue continue
} }
} }
s.logger.Warn("MsgSysWaitStageBinary stage binary timeout")
doAckBufSucceed(s, pkt.AckHandle, []byte{})
} else { } else {
s.logger.Warn("Failed to get stage", zap.String("StageID", pkt.StageID)) s.logger.Warn("Failed to get stage", zap.String("StageID", pkt.StageID))
} }