fix: CPlayerSectorPos false positives and bad math (#2136)

* Closes #2096
This commit is contained in:
gir489 2023-09-17 16:18:20 -04:00 committed by GitHub
parent 3e65e02eda
commit a4209c1b23
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -164,9 +164,12 @@ namespace big
inline bool is_invalid_override_pos(float x, float y)
{
bool crash = ((int)round(fmaxf(0.0, (x + 149.0) - -8192.0) / 75.0)) >= 255 || ((int)round(fmaxf(0.0, (y + 149.0) - -8192.0) / 75.0)) >= 255;
std::uint32_t x_pos = (((x + 149) + 8192) / 75);
std::uint32_t y_pos = (((y + 149) + 8192) / 75);
bool is_x_invalid = x_pos >= UCHAR_MAX;
bool is_y_invalid = y_pos >= UCHAR_MAX;
return crash;
return is_x_invalid || is_y_invalid;
}
inline std::string get_task_type_string(int type)
@ -1339,16 +1342,21 @@ namespace big
}
case sync_node_id("CSectorDataNode"):
{
float player_sector_pos_x{}, player_sector_pos_y{};
get_player_sector_pos(node->m_root->m_next_sync_node, player_sector_pos_x, player_sector_pos_y, object);
const auto sector_node = (CSectorDataNode*)(node);
int posX = (sector_node->m_pos_x - 512.0f) * 54.0f;
int posY = (sector_node->m_pos_y - 512.0f) * 54.0f;
if (is_invalid_override_pos(posX + player_sector_pos_x, posY + player_sector_pos_y))
if ((eNetObjType)object->m_object_type == eNetObjType::NET_OBJ_TYPE_PLAYER)
{
notify::crash_blocked(sender, "invalid sector position (sector node)");
return true;
float player_sector_pos_x{}, player_sector_pos_y{};
get_player_sector_pos(node->m_root->m_next_sync_node, player_sector_pos_x, player_sector_pos_y, object);
const auto sector_node = (CSectorDataNode*)(node);
int posX = (sector_node->m_pos_x - 512.0f) * 54.0f;
int posY = (sector_node->m_pos_y - 512.0f) * 54.0f;
if (is_invalid_override_pos(posX + player_sector_pos_x, posY + player_sector_pos_y))
{
std::stringstream crash_reason;
crash_reason << "invalid sector position (sector node)" << " X: " << posX << " Y: " << posY << " player_sector_pos_x: " << player_sector_pos_x << " player_sector_pos_y: " << player_sector_pos_y;
notify::crash_blocked(sender, crash_reason.str().c_str());
return true;
}
}
break;
}