pulse: fix crash when cleaning up signals

Also make sure the main pulseaudio binary can't be started.
This commit is contained in:
Wim Taymans 2020-08-21 15:36:03 +02:00
parent f3c06372ef
commit 4370675d2b
3 changed files with 12 additions and 8 deletions

View file

@ -31,6 +31,7 @@
static pa_mainloop_api *api = NULL; static pa_mainloop_api *api = NULL;
static bool have_signals = false;
static struct spa_list signals; static struct spa_list signals;
static struct pw_loop *loop = NULL; static struct pw_loop *loop = NULL;
@ -58,14 +59,12 @@ int pa_signal_init(pa_mainloop_api *a)
SPA_EXPORT SPA_EXPORT
void pa_signal_done(void) void pa_signal_done(void)
{ {
pa_signal_event *ev, *t; pa_signal_event *ev;
pa_assert(api);
spa_list_for_each_safe(ev, t, &signals, link)
pa_signal_free(ev);
spa_list_init(&signals);
if (have_signals) {
spa_list_consume(ev, &signals, link)
pa_signal_free(ev);
}
api = NULL; api = NULL;
} }
@ -89,6 +88,9 @@ pa_signal_event* pa_signal_new(int sig, pa_signal_cb_t callback, void *userdata)
ev->callback = callback; ev->callback = callback;
ev->userdata = userdata; ev->userdata = userdata;
if (!have_signals)
spa_list_init(&signals);
have_signals = true;
spa_list_append(&signals, &ev->link); spa_list_append(&signals, &ev->link);
return ev; return ev;

View file

@ -254,6 +254,9 @@ pa_mainloop *pa_mainloop_new(void)
{ {
pa_mainloop *loop; pa_mainloop *loop;
if (getenv("PULSE_INTERNAL"))
return NULL;
loop = calloc(1, sizeof(pa_mainloop)); loop = calloc(1, sizeof(pa_mainloop));
if (loop == NULL) if (loop == NULL)
return NULL; return NULL;

View file

@ -32,4 +32,3 @@ bool pa_is_pipewire(void)
{ {
return true; return true;
} }