From 4c6226d022d00379e6a5008972a8d72246e52059 Mon Sep 17 00:00:00 2001 From: Andreas Maerten <24669514+Yimura@users.noreply.github.com> Date: Tue, 29 Aug 2023 23:58:44 +0200 Subject: [PATCH] fix(MultiKick): check against player nullptr (#2057) * fix(MultiKick): check player ptr before using it * fix(Kick): guard other commands against nullptr player ptr --- src/backend/commands/player/kick/bail_kick.cpp | 3 +++ src/backend/commands/player/kick/breakup_kick.cpp | 2 +- src/backend/commands/player/kick/complaint_kick.cpp | 2 ++ src/backend/commands/player/kick/end_session_kick.cpp | 2 ++ src/backend/commands/player/kick/host_kick.cpp | 2 ++ src/backend/commands/player/kick/multi_kick.cpp | 2 +- src/backend/commands/player/kick/null_function_kick.cpp | 2 ++ src/backend/commands/player/kick/oom_kick.cpp | 2 ++ src/backend/commands/player/kick/script_host_kick.cpp | 2 ++ 9 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/backend/commands/player/kick/bail_kick.cpp b/src/backend/commands/player/kick/bail_kick.cpp index de58eb55..a28c5769 100644 --- a/src/backend/commands/player/kick/bail_kick.cpp +++ b/src/backend/commands/player/kick/bail_kick.cpp @@ -18,6 +18,9 @@ namespace big virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) override { + if (!player) + return; + const size_t arg_count = 3; int64_t args[arg_count] = {(int64_t)eRemoteEvent::NetworkBail, (int64_t)self::id, diff --git a/src/backend/commands/player/kick/breakup_kick.cpp b/src/backend/commands/player/kick/breakup_kick.cpp index a7cc5ad3..087680e9 100644 --- a/src/backend/commands/player/kick/breakup_kick.cpp +++ b/src/backend/commands/player/kick/breakup_kick.cpp @@ -20,7 +20,7 @@ namespace big virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) override { - if (!g_player_service->get_self()->is_host() || !player->get_net_data()) + if (!player || !g_player_service->get_self()->is_host() || !player->get_net_data()) return; rage::snMsgRemoveGamersFromSessionCmd cmd{}; diff --git a/src/backend/commands/player/kick/complaint_kick.cpp b/src/backend/commands/player/kick/complaint_kick.cpp index 5b829ba6..98ba23bd 100644 --- a/src/backend/commands/player/kick/complaint_kick.cpp +++ b/src/backend/commands/player/kick/complaint_kick.cpp @@ -19,6 +19,8 @@ namespace big virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) override { + if (!player) + return; if (gta_util::get_network()->m_game_session_ptr->is_host()) { gta_util::get_network()->m_game_complaint_mgr.raise_complaint(player->get_net_data()->m_host_token); diff --git a/src/backend/commands/player/kick/end_session_kick.cpp b/src/backend/commands/player/kick/end_session_kick.cpp index e5d7e79f..11dcffbf 100644 --- a/src/backend/commands/player/kick/end_session_kick.cpp +++ b/src/backend/commands/player/kick/end_session_kick.cpp @@ -17,6 +17,8 @@ namespace big virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) override { + if (!player) + return; if (!scripts::force_host(RAGE_JOAAT("freemode"))) { g_notification_service->push_error("Kick", "Force script host failed!"); diff --git a/src/backend/commands/player/kick/host_kick.cpp b/src/backend/commands/player/kick/host_kick.cpp index 939e26aa..23809047 100644 --- a/src/backend/commands/player/kick/host_kick.cpp +++ b/src/backend/commands/player/kick/host_kick.cpp @@ -14,6 +14,8 @@ namespace big virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) override { + if (!player) + return; if (!g_player_service->get_self()->is_host()) { g_notification_service->push_error("Host kick", "Host kick failed"); diff --git a/src/backend/commands/player/kick/multi_kick.cpp b/src/backend/commands/player/kick/multi_kick.cpp index cdcdddf9..a7ac0880 100644 --- a/src/backend/commands/player/kick/multi_kick.cpp +++ b/src/backend/commands/player/kick/multi_kick.cpp @@ -25,7 +25,7 @@ namespace big if (g_player_service->get_self()->is_host()) dynamic_cast(command::get(RAGE_JOAAT("hostkick")))->call(player, {}); - if (!player->is_host() && !g_player_service->get_self()->is_host()) + if (player && !player->is_host() && !g_player_service->get_self()->is_host()) dynamic_cast(command::get(RAGE_JOAAT("desync")))->call(player, {}); if (g_player_service->get_self()->is_host()) diff --git a/src/backend/commands/player/kick/null_function_kick.cpp b/src/backend/commands/player/kick/null_function_kick.cpp index 17b14e47..63ef90f0 100644 --- a/src/backend/commands/player/kick/null_function_kick.cpp +++ b/src/backend/commands/player/kick/null_function_kick.cpp @@ -16,6 +16,8 @@ namespace big virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) override { + if (!player) + return; const size_t arg_count = 15; int64_t args[arg_count] = {(int64_t)eRemoteEvent::InteriorControl, (int64_t)self::id, (int64_t)(int)-1}; diff --git a/src/backend/commands/player/kick/oom_kick.cpp b/src/backend/commands/player/kick/oom_kick.cpp index 0e2c6e8a..79a17624 100644 --- a/src/backend/commands/player/kick/oom_kick.cpp +++ b/src/backend/commands/player/kick/oom_kick.cpp @@ -20,6 +20,8 @@ namespace big virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) override { + if (!player) + return; packet msg{}; msg.write_message(rage::eNetMessage::MsgRadioStationSyncRequest); diff --git a/src/backend/commands/player/kick/script_host_kick.cpp b/src/backend/commands/player/kick/script_host_kick.cpp index 713b0b87..e40e8277 100644 --- a/src/backend/commands/player/kick/script_host_kick.cpp +++ b/src/backend/commands/player/kick/script_host_kick.cpp @@ -17,6 +17,8 @@ namespace big virtual void execute(player_ptr player, const command_arguments& _args, const std::shared_ptr ctx) override { + if (!player) + return; if (!scripts::force_host(RAGE_JOAAT("freemode"))) { g_notification_service->push_error("Kick", "Force script host failed!");