From 0af8bdb3500fdcc514a942dbdfd8f11fb46ea651 Mon Sep 17 00:00:00 2001 From: PatTheMav Date: Sat, 8 Oct 2022 17:37:38 +0200 Subject: [PATCH] obs-scripting: Fix script state variable being reset by tick callback When loading a new Python script, the GIL might be released while importing the module, allowing the tick to run and change and reset the cur_python_script state variable. Use the busy_script variable to save and restore the value if not null. --- deps/obs-scripting/obs-scripting-python.c | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/deps/obs-scripting/obs-scripting-python.c b/deps/obs-scripting/obs-scripting-python.c index 124164ebd..ac80c6b45 100644 --- a/deps/obs-scripting/obs-scripting-python.c +++ b/deps/obs-scripting/obs-scripting-python.c @@ -1514,6 +1514,11 @@ void obs_python_script_save(obs_script_t *s) static void python_tick(void *param, float seconds) { struct obs_python_script *data; + /* When loading a new Python script, the GIL might be released while importing the module, + allowing the tick to run and change and reset the cur_python_script state variable. Use the + busy_script variable to save and restore the value if not null. + */ + struct obs_python_script *busy_script; bool valid; uint64_t ts = obs_get_video_frame_time(); @@ -1531,6 +1536,10 @@ static void python_tick(void *param, float seconds) pthread_mutex_lock(&tick_mutex); data = first_tick_script; + + if (cur_python_script) + busy_script = cur_python_script; + while (data) { cur_python_script = data; @@ -1543,6 +1552,10 @@ static void python_tick(void *param, float seconds) } cur_python_script = NULL; + if (busy_script) { + cur_python_script = busy_script; + busy_script = NULL; + } pthread_mutex_unlock(&tick_mutex);