From cba0feaf03aae5c2d8b8249f1e29ab1810a0dc4e Mon Sep 17 00:00:00 2001 From: "NG (Graham)" Date: Sat, 3 Jan 2026 15:57:46 -0500 Subject: [PATCH] Fix multiplayer on_new_connection crash from misconfigured clients --- rc_multiplayer/src/matches/generic.rs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/rc_multiplayer/src/matches/generic.rs b/rc_multiplayer/src/matches/generic.rs index e1237e5..9d13142 100644 --- a/rc_multiplayer/src/matches/generic.rs +++ b/rc_multiplayer/src/matches/generic.rs @@ -518,7 +518,17 @@ impl GenericGamemodeEngine { //tokio::time::sleep(std::time::Duration::from_secs(1)).await; //let id = users.len() as u8; let user_id = user.user_id(); - let player_info = self.descriptors.values().find(|p| p.descriptor.user_id == Some(user_id)).unwrap(); + let player_info_opt = self.descriptors.values().find(|p| p.descriptor.user_id == Some(user_id)); + if player_info_opt.is_none() { + log::warn!("User {} tried to connect to match {} which they are not in", user_id, self.game_guid()); + connection.goodbye(&sender).await; + response.send(Some(super::messages::ErrorMessage { + message: format!("User {} not in match {})", user_id, self.game_guid()), + inner: None, + })).unwrap_or_default(); + return; + } + let player_info = player_info_opt.unwrap(); let id = player_info.descriptor.player_id; let aliases = self.fakes_handler.get_client_ais().await.into_iter().find(|(key, _val)| *key == id).map(|(_key, val)| val).unwrap_or_default(); log::info!("AIs running on new player {}: {:?}", id, aliases);