From 3b044fb98708d856454f6b59f52af6d53dd1c909 Mon Sep 17 00:00:00 2001 From: Houmgaor Date: Sat, 21 Feb 2026 13:49:25 +0100 Subject: [PATCH] fix(channelserver): handle silently swallowed DB scan and exec errors Several handlers discarded errors from rows.Scan() and db.Exec(), masking data corruption or connection issues. Scan failures in diva schedule, event quests, and trend weapons are now logged or returned. InitializeWarehouse now surfaces its insert error to the caller. --- server/channelserver/handlers_diva.go | 4 +++- server/channelserver/handlers_house.go | 4 +++- server/channelserver/handlers_house_test.go | 2 +- server/channelserver/handlers_misc.go | 5 ++++- server/channelserver/handlers_quest.go | 4 +++- server/channelserver/repo_house.go | 6 ++++-- 6 files changed, 18 insertions(+), 7 deletions(-) diff --git a/server/channelserver/handlers_diva.go b/server/channelserver/handlers_diva.go index 78847b2e3..db45d954f 100644 --- a/server/channelserver/handlers_diva.go +++ b/server/channelserver/handlers_diva.go @@ -84,7 +84,9 @@ func handleMsgMhfGetUdSchedule(s *Session, p mhfpacket.MHFPacket) { } else { defer func() { _ = rows.Close() }() for rows.Next() { - _ = rows.Scan(&id, &start) + if err := rows.Scan(&id, &start); err != nil { + s.logger.Error("Failed to scan diva schedule row", zap.Error(err)) + } } } diff --git a/server/channelserver/handlers_house.go b/server/channelserver/handlers_house.go index 226975fc8..9185c3905 100644 --- a/server/channelserver/handlers_house.go +++ b/server/channelserver/handlers_house.go @@ -330,7 +330,9 @@ func handleMsgMhfAcquireTitle(s *Session, p mhfpacket.MHFPacket) { func handleMsgMhfResetTitle(s *Session, p mhfpacket.MHFPacket) {} func initializeWarehouse(s *Session) { - s.server.houseRepo.InitializeWarehouse(s.charID) + if err := s.server.houseRepo.InitializeWarehouse(s.charID); err != nil { + s.logger.Error("Failed to initialize warehouse", zap.Error(err), zap.Uint32("charID", s.charID)) + } } func handleMsgMhfOperateWarehouse(s *Session, p mhfpacket.MHFPacket) { diff --git a/server/channelserver/handlers_house_test.go b/server/channelserver/handlers_house_test.go index 9a2149cff..066ce079f 100644 --- a/server/channelserver/handlers_house_test.go +++ b/server/channelserver/handlers_house_test.go @@ -529,7 +529,7 @@ func TestOperateWarehouse_Op0_GetBoxNames(t *testing.T) { _, _, session, charID := setupHouseTest(t) // Initialize warehouse and rename a box - session.server.houseRepo.InitializeWarehouse(charID) + _ = session.server.houseRepo.InitializeWarehouse(charID) _ = session.server.houseRepo.RenameWarehouseBox(charID, 0, 0, "MyItems") pkt := &mhfpacket.MsgMhfOperateWarehouse{ diff --git a/server/channelserver/handlers_misc.go b/server/channelserver/handlers_misc.go index 8a0dafbe0..69c94bee5 100644 --- a/server/channelserver/handlers_misc.go +++ b/server/channelserver/handlers_misc.go @@ -261,7 +261,10 @@ func handleMsgMhfGetTrendWeapon(s *Session, p mhfpacket.MHFPacket) { j := 0 for rows.Next() { trendWeapons[i][j].WeaponType = i - _ = rows.Scan(&trendWeapons[i][j].WeaponID) + if err := rows.Scan(&trendWeapons[i][j].WeaponID); err != nil { + s.logger.Error("Failed to scan trend weapon", zap.Error(err)) + break + } j++ } } diff --git a/server/channelserver/handlers_quest.go b/server/channelserver/handlers_quest.go index a5670ebb5..f9ae36256 100644 --- a/server/channelserver/handlers_quest.go +++ b/server/channelserver/handlers_quest.go @@ -269,7 +269,9 @@ func makeEventQuest(s *Session, rows *sql.Rows) ([]byte, error) { var questId, activeDuration, inactiveDuration, flags int var maxPlayers, questType uint8 var startTime time.Time - _ = rows.Scan(&id, &maxPlayers, &questType, &questId, &mark, &flags, &startTime, &activeDuration, &inactiveDuration) + if err := rows.Scan(&id, &maxPlayers, &questType, &questId, &mark, &flags, &startTime, &activeDuration, &inactiveDuration); err != nil { + return nil, fmt.Errorf("failed to scan event quest row: %w", err) + } data := loadQuestFile(s, questId) if data == nil { diff --git a/server/channelserver/repo_house.go b/server/channelserver/repo_house.go index 7c905be28..6fc17c165 100644 --- a/server/channelserver/repo_house.go +++ b/server/channelserver/repo_house.go @@ -97,12 +97,14 @@ func (r *HouseRepository) UpdateMission(charID uint32, data []byte) error { // Warehouse methods // InitializeWarehouse ensures a warehouse row exists for the character. -func (r *HouseRepository) InitializeWarehouse(charID uint32) { +func (r *HouseRepository) InitializeWarehouse(charID uint32) error { var t int err := r.db.QueryRow(`SELECT character_id FROM warehouse WHERE character_id=$1`, charID).Scan(&t) if err != nil { - _, _ = r.db.Exec(`INSERT INTO warehouse (character_id) VALUES ($1)`, charID) + _, err = r.db.Exec(`INSERT INTO warehouse (character_id) VALUES ($1)`, charID) + return err } + return nil } const warehouseNamesSQL = `