mirror of
https://github.com/Mezeporta/Erupe.git
synced 2026-03-24 08:33:41 +01:00
feat(savedata): add tier 2 integrity protections
Strengthen savedata persistence against corruption and race conditions: - SHA-256 checksum: hash the decompressed blob on every save, store in new savedata_hash column, verify on load to detect silent corruption. Pre-existing characters with no hash are silently upgraded on next save. - Atomic transactions: wrap character data + house data + hash + backup into a single DB transaction via SaveCharacterDataAtomic, so a crash mid-save never leaves partial state. - Per-character save mutex: CharacterLocks (sync.Map of charID → Mutex) serializes concurrent saves for the same character, preventing races that could defeat corruption detection. Different characters remain fully independent. Migration 0008 adds the savedata_hash column to the characters table.
This commit is contained in:
@@ -28,6 +28,11 @@ const (
|
||||
func handleMsgMhfSavedata(s *Session, p mhfpacket.MHFPacket) {
|
||||
pkt := p.(*mhfpacket.MsgMhfSavedata)
|
||||
|
||||
// Serialize saves for the same character to prevent concurrent operations
|
||||
// from racing and defeating corruption detection.
|
||||
unlock := s.server.charSaveLocks.Lock(s.charID)
|
||||
defer unlock()
|
||||
|
||||
if len(pkt.RawDataPayload) > saveDataMaxCompressedPayload {
|
||||
s.logger.Warn("Savedata payload exceeds size limit",
|
||||
zap.Int("len", len(pkt.RawDataPayload)),
|
||||
|
||||
Reference in New Issue
Block a user