mirror of
https://github.com/DarkflameUniverse/DarkflameServer.git
synced 2026-11-04 10:57:13 +00:00
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:
@@ -125,8 +125,12 @@ namespace GameMessages {
|
|||||||
void MissionDialogueOK::Handle(Entity& entityRef, const SystemAddress& sysAddr) {
|
void MissionDialogueOK::Handle(Entity& entityRef, const SystemAddress& sysAddr) {
|
||||||
Entity* entity = &entityRef;
|
Entity* entity = &entityRef;
|
||||||
Entity* player = Game::entityManager->GetEntity(responder);
|
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
|
// Get the player's mission component
|
||||||
MissionComponent* missionComponent = static_cast<MissionComponent*>(player->GetComponent(eReplicaComponentType::MISSION));
|
MissionComponent* missionComponent = static_cast<MissionComponent*>(player->GetComponent(eReplicaComponentType::MISSION));
|
||||||
|
|||||||
@@ -266,3 +266,15 @@ TEST_F(MissionMessagesTests, GoldenBytes) {
|
|||||||
task.updates = { 1.5f, 2.0f };
|
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));
|
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();
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user