[client] overlay/msg: fix race condition in render
Some checks are pending
build / client (Debug, map[cc:clang cxx:clang++], libdecor) (push) Waiting to run
build / client (Debug, map[cc:clang cxx:clang++], xdg-shell) (push) Waiting to run
build / client (Debug, map[cc:gcc cxx:g++], libdecor) (push) Waiting to run
build / client (Debug, map[cc:gcc cxx:g++], xdg-shell) (push) Waiting to run
build / client (Release, map[cc:clang cxx:clang++], libdecor) (push) Waiting to run
build / client (Release, map[cc:clang cxx:clang++], xdg-shell) (push) Waiting to run
build / client (Release, map[cc:gcc cxx:g++], libdecor) (push) Waiting to run
build / client (Release, map[cc:gcc cxx:g++], xdg-shell) (push) Waiting to run
build / module (push) Waiting to run
build / host-linux (push) Waiting to run
build / host-windows-cross (push) Waiting to run
build / host-windows-native (push) Waiting to run
build / obs (clang) (push) Waiting to run
build / obs (gcc) (push) Waiting to run
build / docs (push) Waiting to run

If an overlay is closed with overlayMsg_close, the message can be freed
while it is still being used by msg_render, resulting in a segfault. Lock
the message list for the duration of msg_render to fix this.
This commit is contained in:
Chris Spencer
2025-02-11 16:08:20 +00:00
committed by Geoffrey McRae
parent 7e9e38faa5
commit 03ca20d3e4
3 changed files with 39 additions and 25 deletions

View File

@@ -41,11 +41,14 @@ struct ll
};
struct ll * ll_new(void);
void ll_free (struct ll * list);
void ll_push (struct ll * list, void * data);
bool ll_shift (struct ll * list, void ** data);
bool ll_peek_head(struct ll * list, void ** data);
bool ll_peek_tail(struct ll * list, void ** data);
void ll_free (struct ll * list);
void ll_push (struct ll * list, void * data);
bool ll_shift (struct ll * list, void ** data);
bool ll_shift_nl (struct ll * list, void ** data);
bool ll_peek_head (struct ll * list, void ** data);
bool ll_peek_head_nl(struct ll * list, void ** data);
bool ll_peek_tail (struct ll * list, void ** data);
bool ll_peek_tail_nl(struct ll * list, void ** data);
#define ll_lock(ll) LG_LOCK((ll)->lock)
#define ll_unlock(ll) LG_UNLOCK((ll)->lock)