From e7dd31f37b7e6491a75f63ca0770df39fd8730b3 Mon Sep 17 00:00:00 2001 From: uvjustin <46082645+uvjustin@users.noreply.github.com> Date: Tue, 15 Nov 2022 22:02:35 +0800 Subject: [PATCH] Iterate over entities safely in camera setup (#82080) fixes undefined --- homeassistant/components/camera/__init__.py | 2 +- homeassistant/helpers/entity_component.py | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/homeassistant/components/camera/__init__.py b/homeassistant/components/camera/__init__.py index 82d981fc0cc..a8c6b1ea517 100644 --- a/homeassistant/components/camera/__init__.py +++ b/homeassistant/components/camera/__init__.py @@ -359,7 +359,7 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: await component.async_setup(config) async def preload_stream(_event: Event) -> None: - for camera in component.entities: + for camera in list(component.entities): stream_prefs = await prefs.get_dynamic_stream_settings(camera.entity_id) if not stream_prefs.preload_stream: continue diff --git a/homeassistant/helpers/entity_component.py b/homeassistant/helpers/entity_component.py index eea0a9943a3..f7f2b7e3dd3 100644 --- a/homeassistant/helpers/entity_component.py +++ b/homeassistant/helpers/entity_component.py @@ -90,7 +90,12 @@ class EntityComponent(Generic[_EntityT]): @property def entities(self) -> Iterable[_EntityT]: - """Return an iterable that returns all entities.""" + """ + Return an iterable that returns all entities. + + As the underlying dicts may change when async context is lost, callers that + iterate over this asynchronously should make a copy using list() before iterating. + """ return chain.from_iterable( platform.entities.values() # type: ignore[misc] for platform in self._platforms.values()