jack: fix invalid unlink

Don't unlink the mix->link when freeing, it is only linked when
in the free pool.

Protect against invalid number of buffers that could corrupt our
state.
This commit is contained in:
Wim Taymans 2020-02-18 17:37:02 +01:00
parent 463b9e4e29
commit 1f3cb3d207

View file

@ -408,7 +408,6 @@ static struct mix *ensure_mix(struct client *c, struct port *port, uint32_t mix_
static void free_mix(struct client *c, struct mix *mix) static void free_mix(struct client *c, struct mix *mix)
{ {
spa_list_remove(&mix->link);
spa_list_remove(&mix->port_link); spa_list_remove(&mix->port_link);
spa_list_append(&c->free_mix, &mix->link); spa_list_append(&c->free_mix, &mix->link);
} }
@ -444,12 +443,12 @@ static struct port * alloc_port(struct client *c, enum spa_direction direction)
static void free_port(struct client *c, struct port *p) static void free_port(struct client *c, struct port *p)
{ {
struct mix *m, *t; struct mix *m;
if (!p->valid) if (!p->valid)
return; return;
spa_list_for_each_safe(m, t, &p->mix, port_link) spa_list_consume(m, &p->mix, port_link)
free_mix(c, m); free_mix(c, m);
spa_list_remove(&p->link); spa_list_remove(&p->link);
@ -1532,6 +1531,9 @@ static int client_node_port_use_buffers(void *object,
pw_log_debug(NAME" %p: port %p %d %d.%d use_buffers %d", c, p, direction, pw_log_debug(NAME" %p: port %p %d %d.%d use_buffers %d", c, p, direction,
port_id, mix_id, n_buffers); port_id, mix_id, n_buffers);
if (n_buffers > MAX_BUFFERS)
return -EINVAL;
if (p->object->port.type_id == 2 && direction == SPA_DIRECTION_INPUT) { if (p->object->port.type_id == 2 && direction == SPA_DIRECTION_INPUT) {
fl = PW_MEMMAP_FLAG_READ; fl = PW_MEMMAP_FLAG_READ;
} else { } else {