Skip to content

Commit d372d8d

Browse files
committed
Fix access violation if callbacks are added or removed while a callback is being processed
1 parent d52d4ac commit d372d8d

File tree

2 files changed

+8
-4
lines changed

2 files changed

+8
-4
lines changed

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010

1111
setuptools.setup(
1212
name="simpleobsws",
13-
version="1.4.2",
13+
version="1.4.3",
1414
author="tt2468",
1515
author_email="tt2468@gmail.com",
1616
description="A simple obs-websocket library in async Python for people who just want JSON output.",

simpleobsws.py

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -242,12 +242,16 @@ def register_event_callback(self, callback, event: str = None):
242242
if not inspect.iscoroutinefunction(callback):
243243
raise EventRegistrationError('Registered functions must be async')
244244
else:
245-
self.event_callbacks.append((callback, event))
245+
event_callbacks_copy = self.event_callbacks.copy()
246+
event_callbacks_copy.append((callback, event))
247+
self.event_callbacks = event_callbacks_copy
246248

247249
def deregister_event_callback(self, callback, event: str = None):
248-
for c, t in self.event_callbacks.copy():
250+
event_callbacks_copy = self.event_callbacks.copy()
251+
for c, t in self.event_callbacks: # We can use the old event_callbacks list to avoid our iterator being invalidated
249252
if (c == callback) and (event == None or t == event):
250-
self.event_callbacks.remove((c, t))
253+
event_callbacks_copy.remove((c, t))
254+
self.event_callbacks = event_callbacks_copy
251255

252256
def is_identified(self):
253257
return self.identified

0 commit comments

Comments
 (0)