diff options
author | Fabio Alessandrelli <fabio.alessandrelli@gmail.com> | 2023-02-14 13:18:19 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-02-14 13:18:19 +0100 |
commit | 02dcf40162a86fa4636f7b4ee2a7dbc7882a700c (patch) | |
tree | 3598789c5daf1ef6d95d41b7b113ea8a552b3e75 | |
parent | d2699dc7ab96fbd75faccc1f32f55baebf1d84dc (diff) | |
parent | 2eadbe7b78ab299359a8f8c4f9eb5d67e4b4aac9 (diff) |
Merge pull request #73216 from baptr/multiplayer
Fix multiplayer replication crash in on_sync_receive.
-rw-r--r-- | modules/multiplayer/scene_replication_interface.cpp | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/modules/multiplayer/scene_replication_interface.cpp b/modules/multiplayer/scene_replication_interface.cpp index 3466cb10df..68b6bc4a24 100644 --- a/modules/multiplayer/scene_replication_interface.cpp +++ b/modules/multiplayer/scene_replication_interface.cpp @@ -742,6 +742,7 @@ Error SceneReplicationInterface::on_sync_receive(int p_from, const uint8_t *p_bu ofs += 4; uint32_t size = decode_uint32(&p_buffer[ofs]); ofs += 4; + ERR_FAIL_COND_V(size > uint32_t(p_buffer_len - ofs), ERR_INVALID_DATA); MultiplayerSynchronizer *sync = nullptr; if (net_id & 0x80000000) { sync = Object::cast_to<MultiplayerSynchronizer>(multiplayer->get_path_cache()->get_cached_object(p_from, net_id & 0x7FFFFFFF)); @@ -756,14 +757,15 @@ Error SceneReplicationInterface::on_sync_receive(int p_from, const uint8_t *p_bu } Node *node = sync->get_root_node(); if (sync->get_multiplayer_authority() != p_from || !node) { - ERR_CONTINUE(true); + // Not valid for me. + ofs += size; + ERR_CONTINUE_MSG(true, "Ignoring sync data from non-authority or for missing node."); } if (!sync->update_inbound_sync_time(time)) { // State is too old. ofs += size; continue; } - ERR_FAIL_COND_V(size > uint32_t(p_buffer_len - ofs), ERR_BUG); const List<NodePath> props = sync->get_replication_config()->get_sync_properties(); Vector<Variant> vars; vars.resize(props.size()); |