docs: mark binary I/O and copy-paste anti-patterns as resolved

Binary I/O (#5): all 12 remaining encoding/binary calls are
legitimate (zero-alloc spot-reads, random-access into game blobs).
Copy-paste handlers (#8): loadCharacterData/saveCharacterData helpers
now cover standard blob patterns.

Also upgrades saveCharacterData to send doAckSimpleFail on oversize
payloads and DB errors, and migrates handleMsgMhfSaveScenarioData
to the improved helper.
This commit is contained in:
Houmgaor
2026-02-20 20:55:06 +01:00
parent a752c5187e
commit d5c44b5557
3 changed files with 14 additions and 56 deletions

View File

@@ -184,19 +184,7 @@ func handleMsgMhfLoaddata(s *Session, p mhfpacket.MHFPacket) {
func handleMsgMhfSaveScenarioData(s *Session, p mhfpacket.MHFPacket) {
pkt := p.(*mhfpacket.MsgMhfSaveScenarioData)
if len(pkt.RawDataPayload) > 65536 {
s.logger.Warn("Scenario payload too large", zap.Int("len", len(pkt.RawDataPayload)))
doAckSimpleFail(s, pkt.AckHandle, make([]byte, 4))
return
}
dumpSaveData(s, pkt.RawDataPayload, "scenario")
_, err := s.server.db.Exec("UPDATE characters SET scenariodata = $1 WHERE id = $2", pkt.RawDataPayload, s.charID)
if err != nil {
s.logger.Error("Failed to update scenario data in db", zap.Error(err))
doAckSimpleFail(s, pkt.AckHandle, make([]byte, 4))
return
}
doAckSimpleSucceed(s, pkt.AckHandle, make([]byte, 4))
saveCharacterData(s, pkt.AckHandle, "scenariodata", pkt.RawDataPayload, 65536)
}
func handleMsgMhfLoadScenarioData(s *Session, p mhfpacket.MHFPacket) {

View File

@@ -83,13 +83,15 @@ func loadCharacterData(s *Session, ackHandle uint32, column string, defaultData
func saveCharacterData(s *Session, ackHandle uint32, column string, data []byte, maxSize int) {
if maxSize > 0 && len(data) > maxSize {
s.logger.Warn("Payload too large for "+column, zap.Int("len", len(data)), zap.Int("max", maxSize))
doAckSimpleSucceed(s, ackHandle, make([]byte, 4))
doAckSimpleFail(s, ackHandle, make([]byte, 4))
return
}
dumpSaveData(s, data, column)
_, err := s.server.db.Exec("UPDATE characters SET "+column+"=$1 WHERE id=$2", data, s.charID)
if err != nil {
s.logger.Error("Failed to save "+column, zap.Error(err))
doAckSimpleFail(s, ackHandle, make([]byte, 4))
return
}
doAckSimpleSucceed(s, ackHandle, make([]byte, 4))
}