fix(behaviour): don't crash on MissionDialogueOK from an unknown responder

THIS CHANGES SERVER BEHAVIOUR (intentionally); no wire change.

The MissionDialogueOK handler (carried over verbatim from
GameMessages::HandleMissionDialogOK) dereferenced the responder without
a null check, so a client naming an object that doesn't exist crashed
the world server. It now logs and ignores the message; the script
callback is no longer called with a null player (that path always
ended in the crash).

Test: handling a MissionDialogueOK with an unknown responder crashes
without this change and passes with it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Aaron Kimbrell
2026-09-26 12:46:58 -05:00
parent d599b788d0
commit 1f1edf790f
2 changed files with 17 additions and 1 deletions

View File

@@ -266,3 +266,15 @@ TEST_F(MissionMessagesTests, GoldenBytes) {
task.updates = { 1.5f, 2.0f };
EXPECT_PACKET_EQ(FromHex("01 00 00 00 04 00 00 00 02 00 00 c0 3f 00 00 00 40"), Payload(task));
}
// Behaviour fix: a MissionDialogueOK naming a responder that does not exist used to dereference a null player.
TEST_F(MissionMessagesTests, MissionDialogueOKWithUnknownResponderDoesNotCrash) {
Entity missionGiver(15, info);
GameMessages::MissionDialogueOK ok;
ok.bIsComplete = false;
ok.iMissionState = eMissionState::AVAILABLE;
ok.missionID = 1727;
ok.responder = 0x7777; // no such entity
ok.Handle(missionGiver, UNASSIGNED_SYSTEM_ADDRESS);
SUCCEED();
}