context: protect against bad context state

Avoid crash in firefox when daemon is stopped.
This commit is contained in:
Wim Taymans 2020-10-23 17:10:19 +02:00
parent 42e60b66f3
commit 732bf4b58c
2 changed files with 9 additions and 0 deletions

View file

@ -1923,6 +1923,8 @@ pa_operation* pa_context_drain(pa_context *c, pa_context_notify_cb_t cb, void *u
pa_operation *o; pa_operation *o;
struct notify_data *d; struct notify_data *d;
PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
o = pa_operation_new(c, NULL, on_notify, sizeof(struct notify_data)); o = pa_operation_new(c, NULL, on_notify, sizeof(struct notify_data));
d = o->userdata; d = o->userdata;
d->cb = cb; d->cb = cb;
@ -1938,6 +1940,8 @@ pa_operation* pa_context_exit_daemon(pa_context *c, pa_context_success_cb_t cb,
pa_operation *o; pa_operation *o;
struct success_data *d; struct success_data *d;
PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
o = pa_operation_new(c, NULL, on_success, sizeof(struct success_data)); o = pa_operation_new(c, NULL, on_success, sizeof(struct success_data));
d = o->userdata; d = o->userdata;
d->error = PA_ERR_NOTIMPLEMENTED; d->error = PA_ERR_NOTIMPLEMENTED;
@ -1994,6 +1998,8 @@ pa_operation* pa_context_set_default_sink(pa_context *c, const char *name, pa_co
pa_operation *o; pa_operation *o;
struct default_node *d; struct default_node *d;
PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
o = pa_operation_new(c, NULL, do_default_node, sizeof(*d)); o = pa_operation_new(c, NULL, do_default_node, sizeof(*d));
d = o->userdata; d = o->userdata;
d->mask = PA_SUBSCRIPTION_MASK_SINK; d->mask = PA_SUBSCRIPTION_MASK_SINK;
@ -2012,6 +2018,8 @@ pa_operation* pa_context_set_default_source(pa_context *c, const char *name, pa_
pa_operation *o; pa_operation *o;
struct default_node *d; struct default_node *d;
PA_CHECK_VALIDITY_RETURN_NULL(c, c->state == PA_CONTEXT_READY, PA_ERR_BADSTATE);
o = pa_operation_new(c, NULL, do_default_node, sizeof(*d)); o = pa_operation_new(c, NULL, do_default_node, sizeof(*d));
d = o->userdata; d = o->userdata;
d->mask = PA_SUBSCRIPTION_MASK_SOURCE; d->mask = PA_SUBSCRIPTION_MASK_SOURCE;

View file

@ -660,6 +660,7 @@ static void stream_unlink(pa_stream *s)
if (o->stream == s) if (o->stream == s)
pa_operation_cancel(o); pa_operation_cancel(o);
} }
s->drain = NULL;
spa_list_remove(&s->link); spa_list_remove(&s->link);
if (s->stream) if (s->stream)