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) 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) inline std::string get_task_type_string(int type)
@ -1338,6 +1341,8 @@ namespace big
break; break;
} }
case sync_node_id("CSectorDataNode"): case sync_node_id("CSectorDataNode"):
{
if ((eNetObjType)object->m_object_type == eNetObjType::NET_OBJ_TYPE_PLAYER)
{ {
float player_sector_pos_x{}, player_sector_pos_y{}; 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); get_player_sector_pos(node->m_root->m_next_sync_node, player_sector_pos_x, player_sector_pos_y, object);
@ -1347,9 +1352,12 @@ namespace big
int posY = (sector_node->m_pos_y - 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 (is_invalid_override_pos(posX + player_sector_pos_x, posY + player_sector_pos_y))
{ {
notify::crash_blocked(sender, "invalid sector position (sector node)"); 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; return true;
} }
}
break; break;
} }
case sync_node_id("CPlayerGameStateDataNode"): case sync_node_id("CPlayerGameStateDataNode"):