From 7676f2e7d586ad289e6f6fc2741ba20e52c6cc3f Mon Sep 17 00:00:00 2001 From: wish Date: Fri, 23 Dec 2022 23:12:01 +1100 Subject: [PATCH] terminate session on save corruption --- server/channelserver/handlers_character.go | 3 +++ server/channelserver/handlers_data.go | 13 ++++++++----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/server/channelserver/handlers_character.go b/server/channelserver/handlers_character.go index a3e671969..8499f9b17 100644 --- a/server/channelserver/handlers_character.go +++ b/server/channelserver/handlers_character.go @@ -2,6 +2,8 @@ package channelserver import ( "encoding/binary" + "erupe-ce/common/bfutil" + "erupe-ce/common/stringsupport" "erupe-ce/network/mhfpacket" "erupe-ce/server/channelserver/compression/nullcomp" @@ -135,6 +137,7 @@ func (save *CharacterSaveData) updateSaveDataWithStruct() { // This will update the save struct with the values stored in the character save func (save *CharacterSaveData) updateStructWithSaveData() { + save.Name = stringsupport.SJISToUTF8(bfutil.UpToNull(save.decompSave[88:100])) if save.decompSave[pointerGender] == 1 { save.Gender = true } else { diff --git a/server/channelserver/handlers_data.go b/server/channelserver/handlers_data.go index 28521d10d..83981a580 100644 --- a/server/channelserver/handlers_data.go +++ b/server/channelserver/handlers_data.go @@ -2,7 +2,6 @@ package channelserver import ( "encoding/hex" - "erupe-ce/common/bfutil" "erupe-ce/common/stringsupport" "fmt" "io" @@ -46,10 +45,14 @@ func handleMsgMhfSavedata(s *Session, p mhfpacket.MHFPacket) { characterSaveData.decompSave = saveData } characterSaveData.updateStructWithSaveData() - characterSaveData.Save(s) - s.logger.Info("Wrote recompressed savedata back to DB.") - - characterSaveData.Name = stringsupport.SJISToUTF8(bfutil.UpToNull(characterSaveData.decompSave[88:100])) + if characterSaveData.Name == s.Name { + characterSaveData.Save(s) + s.logger.Info("Wrote recompressed savedata back to DB.") + } else { + s.logger.Warn("Save cancelled due to corruption.") + s.rawConn.Close() + return + } _, err = s.server.db.Exec("UPDATE characters SET name=$1 WHERE id=$2", characterSaveData.Name, s.charID) if err != nil { s.logger.Fatal("Failed to update character name in db", zap.Error(err))