From e6e2c54ec95b3382b85665ac14a906ecf0873184 Mon Sep 17 00:00:00 2001 From: "Dylan K. Taylor" Date: Wed, 1 Nov 2023 16:28:59 +0000 Subject: [PATCH] Fixed various reentrant-unsafe 2D array element unsets (similar to previous commit) this pattern was used in various places --- src/Server.php | 5 +++-- src/plugin/PluginManager.php | 9 ++++++--- src/world/World.php | 27 ++++++++++++++++----------- 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/Server.php b/src/Server.php index 9adc8e794..dad61f48c 100644 --- a/src/Server.php +++ b/src/Server.php @@ -1259,9 +1259,10 @@ class Server{ */ public function unsubscribeFromBroadcastChannel(string $channelId, CommandSender $subscriber) : void{ if(isset($this->broadcastSubscribers[$channelId][spl_object_id($subscriber)])){ - unset($this->broadcastSubscribers[$channelId][spl_object_id($subscriber)]); - if(count($this->broadcastSubscribers[$channelId]) === 0){ + if(count($this->broadcastSubscribers[$channelId]) === 1){ unset($this->broadcastSubscribers[$channelId]); + }else{ + unset($this->broadcastSubscribers[$channelId][spl_object_id($subscriber)]); } } } diff --git a/src/plugin/PluginManager.php b/src/plugin/PluginManager.php index 67ca8cc37..301c66854 100644 --- a/src/plugin/PluginManager.php +++ b/src/plugin/PluginManager.php @@ -510,9 +510,12 @@ class PluginManager{ unset($this->enabledPlugins[$plugin->getDescription()->getName()]); foreach(Utils::stringifyKeys($this->pluginDependents) as $dependency => $dependentList){ - unset($this->pluginDependents[$dependency][$plugin->getDescription()->getName()]); - if(count($this->pluginDependents[$dependency]) === 0){ - unset($this->pluginDependents[$dependency]); + if(isset($this->pluginDependents[$dependency][$plugin->getDescription()->getName()])){ + if(count($this->pluginDependents[$dependency]) === 1){ + unset($this->pluginDependents[$dependency]); + }else{ + unset($this->pluginDependents[$dependency][$plugin->getDescription()->getName()]); + } } } diff --git a/src/world/World.php b/src/world/World.php index 8265aa384..e705124f3 100644 --- a/src/world/World.php +++ b/src/world/World.php @@ -826,14 +826,15 @@ class World implements ChunkManager{ $chunkHash = World::chunkHash($chunkX, $chunkZ); $loaderId = spl_object_id($loader); if(isset($this->chunkLoaders[$chunkHash][$loaderId])){ - unset($this->chunkLoaders[$chunkHash][$loaderId]); - if(count($this->chunkLoaders[$chunkHash]) === 0){ + if(count($this->chunkLoaders[$chunkHash]) === 1){ unset($this->chunkLoaders[$chunkHash]); $this->unloadChunkRequest($chunkX, $chunkZ, true); if(isset($this->chunkPopulationRequestMap[$chunkHash]) && !isset($this->activeChunkPopulationTasks[$chunkHash])){ $this->chunkPopulationRequestMap[$chunkHash]->reject(); unset($this->chunkPopulationRequestMap[$chunkHash]); } + }else{ + unset($this->chunkLoaders[$chunkHash][$loaderId]); } } } @@ -861,11 +862,12 @@ class World implements ChunkManager{ public function unregisterChunkListener(ChunkListener $listener, int $chunkX, int $chunkZ) : void{ $hash = World::chunkHash($chunkX, $chunkZ); if(isset($this->chunkListeners[$hash])){ - unset($this->chunkListeners[$hash][spl_object_id($listener)]); - unset($this->playerChunkListeners[$hash][spl_object_id($listener)]); - if(count($this->chunkListeners[$hash]) === 0){ + if(count($this->chunkListeners[$hash]) === 1){ unset($this->chunkListeners[$hash]); unset($this->playerChunkListeners[$hash]); + }else{ + unset($this->chunkListeners[$hash][spl_object_id($listener)]); + unset($this->playerChunkListeners[$hash][spl_object_id($listener)]); } } } @@ -1224,13 +1226,14 @@ class World implements ChunkManager{ $chunkHash = World::chunkHash($chunkX, $chunkZ); $tickerId = spl_object_id($ticker); if(isset($this->registeredTickingChunks[$chunkHash][$tickerId])){ - unset($this->registeredTickingChunks[$chunkHash][$tickerId]); - if(count($this->registeredTickingChunks[$chunkHash]) === 0){ + if(count($this->registeredTickingChunks[$chunkHash]) === 1){ unset( $this->registeredTickingChunks[$chunkHash], $this->recheckTickingChunks[$chunkHash], $this->validTickingChunks[$chunkHash] ); + }else{ + unset($this->registeredTickingChunks[$chunkHash][$tickerId]); } } } @@ -2645,9 +2648,10 @@ class World implements ChunkManager{ $pos = $this->entityLastKnownPositions[$entity->getId()]; $chunkHash = World::chunkHash($pos->getFloorX() >> Chunk::COORD_BIT_SIZE, $pos->getFloorZ() >> Chunk::COORD_BIT_SIZE); if(isset($this->entitiesByChunk[$chunkHash][$entity->getId()])){ - unset($this->entitiesByChunk[$chunkHash][$entity->getId()]); - if(count($this->entitiesByChunk[$chunkHash]) === 0){ + if(count($this->entitiesByChunk[$chunkHash]) === 1){ unset($this->entitiesByChunk[$chunkHash]); + }else{ + unset($this->entitiesByChunk[$chunkHash][$entity->getId()]); } } unset($this->entityLastKnownPositions[$entity->getId()]); @@ -2680,9 +2684,10 @@ class World implements ChunkManager{ if($oldChunkX !== $newChunkX || $oldChunkZ !== $newChunkZ){ $oldChunkHash = World::chunkHash($oldChunkX, $oldChunkZ); if(isset($this->entitiesByChunk[$oldChunkHash][$entity->getId()])){ - unset($this->entitiesByChunk[$oldChunkHash][$entity->getId()]); - if(count($this->entitiesByChunk[$oldChunkHash]) === 0){ + if(count($this->entitiesByChunk[$oldChunkHash]) === 1){ unset($this->entitiesByChunk[$oldChunkHash]); + }else{ + unset($this->entitiesByChunk[$oldChunkHash][$entity->getId()]); } }