pulse-server: stream: only remove from list if pending

Only call `spa_list_remove()` in `stream_free()` if the
stream is pending. `spa_list_remove()` does not reinitialize
the list node, therefore calling `spa_list_remove()` again
after the stream has been removed from the pending list
will corrupt the pending list of the client.
This commit is contained in:
Barnabás Pőcze 2021-12-14 14:39:38 +01:00 committed by Wim Taymans
parent 043934655a
commit 6f412236d5
3 changed files with 8 additions and 3 deletions

View file

@ -728,6 +728,7 @@ static void manager_added(void *data, struct pw_manager_object *o)
if (peer) { if (peer) {
reply_create_stream(s, peer); reply_create_stream(s, peer);
spa_list_remove(&s->link); spa_list_remove(&s->link);
s->pending = false;
} }
} }
@ -1070,10 +1071,12 @@ static void stream_param_changed(void *data, uint32_t id, const struct spa_pod *
/* if peer exists, reply immediately, otherwise reply when the link is created */ /* if peer exists, reply immediately, otherwise reply when the link is created */
peer = find_linked(stream->client->manager, stream->id, stream->direction); peer = find_linked(stream->client->manager, stream->id, stream->direction);
if (peer) if (peer) {
reply_create_stream(stream, peer); reply_create_stream(stream, peer);
else } else {
spa_list_append(&stream->client->pending_streams, &stream->link); spa_list_append(&stream->client->pending_streams, &stream->link);
stream->pending = true;
}
} }
params[n_params++] = get_buffers_param(stream, &stream->attr, &b); params[n_params++] = get_buffers_param(stream, &stream->attr, &b);

View file

@ -96,7 +96,8 @@ void stream_free(struct stream *stream)
pw_log_debug("client %p: stream %p channel:%d", client, stream, stream->channel); pw_log_debug("client %p: stream %p channel:%d", client, stream, stream->channel);
spa_list_remove(&stream->link); if (stream->pending)
spa_list_remove(&stream->link);
if (stream->drain_tag) if (stream->drain_tag)
reply_error(client, -1, stream->drain_tag, -ENOENT); reply_error(client, -1, stream->drain_tag, -ENOENT);

View file

@ -106,6 +106,7 @@ struct stream {
unsigned int in_prebuf:1; unsigned int in_prebuf:1;
unsigned int done:1; unsigned int done:1;
unsigned int killed:1; unsigned int killed:1;
unsigned int pending:1;
}; };
struct stream *stream_new(struct client *client, enum stream_type type, uint32_t create_tag, struct stream *stream_new(struct client *client, enum stream_type type, uint32_t create_tag,