diff --git a/server/channelserver/handlers_mercenary.go b/server/channelserver/handlers_mercenary.go index 4bcfac472..cc2d6102c 100644 --- a/server/channelserver/handlers_mercenary.go +++ b/server/channelserver/handlers_mercenary.go @@ -188,7 +188,7 @@ func handleMsgMhfCreateMercenary(s *Session, p mhfpacket.MHFPacket) { func handleMsgMhfSaveMercenary(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgMhfSaveMercenary) dumpSaveData(s, pkt.MercData, "mercenary") - if len(pkt.MercData) > 0 { + if len(pkt.MercData) >= 4 { temp := byteframe.NewByteFrameFromBytes(pkt.MercData) if _, err := s.server.db.Exec("UPDATE characters SET savemercenary=$1, rasta_id=$2 WHERE id=$3", pkt.MercData, temp.ReadUint32(), s.charID); err != nil { s.logger.Error("Failed to save mercenary data", zap.Error(err)) diff --git a/server/channelserver/handlers_rengoku.go b/server/channelserver/handlers_rengoku.go index 0a8f9c573..b1d40fb7b 100644 --- a/server/channelserver/handlers_rengoku.go +++ b/server/channelserver/handlers_rengoku.go @@ -16,6 +16,11 @@ func handleMsgMhfSaveRengokuData(s *Session, p mhfpacket.MHFPacket) { // saved every floor on road, holds values such as floors progressed, points etc. // can be safely handled by the client pkt := p.(*mhfpacket.MsgMhfSaveRengokuData) + if len(pkt.RawDataPayload) < 91 { + s.logger.Warn("Rengoku payload too short", zap.Int("len", len(pkt.RawDataPayload))) + doAckSimpleSucceed(s, pkt.AckHandle, make([]byte, 4)) + return + } dumpSaveData(s, pkt.RawDataPayload, "rengoku") _, err := s.server.db.Exec("UPDATE characters SET rengokudata=$1 WHERE id=$2", pkt.RawDataPayload, s.charID) if err != nil { diff --git a/server/channelserver/handlers_users.go b/server/channelserver/handlers_users.go index ef913e479..f84399a57 100644 --- a/server/channelserver/handlers_users.go +++ b/server/channelserver/handlers_users.go @@ -13,6 +13,10 @@ func handleMsgSysDeleteUser(s *Session, p mhfpacket.MHFPacket) {} func handleMsgSysSetUserBinary(s *Session, p mhfpacket.MHFPacket) { pkt := p.(*mhfpacket.MsgSysSetUserBinary) + if pkt.BinaryType < 1 || pkt.BinaryType > 5 { + s.logger.Warn("Invalid BinaryType", zap.Uint8("type", pkt.BinaryType)) + return + } s.server.userBinaryPartsLock.Lock() s.server.userBinaryParts[userBinaryPartID{charID: s.charID, index: pkt.BinaryType}] = pkt.RawDataPayload s.server.userBinaryPartsLock.Unlock()