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 55fd5aa8c3
commit fc49e70c81
2 changed files with 17 additions and 1 deletions

View File

@@ -125,8 +125,12 @@ namespace GameMessages {
void MissionDialogueOK::Handle(Entity& entityRef, const SystemAddress& sysAddr) {
Entity* entity = &entityRef;
Entity* player = Game::entityManager->GetEntity(responder);
if (!player) {
LOG("MissionDialogueOK for mission %i from unknown responder %llu", missionID, responder);
return;
}
if (entity) entity->GetScript()->OnMissionDialogueOK(entity, player, missionID, iMissionState);
entity->GetScript()->OnMissionDialogueOK(entity, player, missionID, iMissionState);
// Get the player's mission component
MissionComponent* missionComponent = static_cast<MissionComponent*>(player->GetComponent(eReplicaComponentType::MISSION));

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();
}