mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-11-04 13:30:12 -05:00
remote: free io area after we set the new area
First set the new area, then destroy the old one. Otherwise the data thread might still be using the old area and crash.
This commit is contained in:
parent
dc331aa562
commit
0fd46d057e
2 changed files with 21 additions and 19 deletions
|
|
@ -1287,18 +1287,16 @@ static int client_node_set_io(void *object,
|
|||
uint32_t size)
|
||||
{
|
||||
struct client *c = (struct client *) object;
|
||||
struct pw_memmap *mm;
|
||||
struct pw_memmap *old, *mm;
|
||||
void *ptr;
|
||||
uint32_t tag[5] = { c->node_id, id, };
|
||||
|
||||
if ((mm = pw_mempool_find_tag(c->pool, tag, sizeof(tag))) != NULL)
|
||||
pw_memmap_free(mm);
|
||||
old = pw_mempool_find_tag(c->pool, tag, sizeof(tag));
|
||||
|
||||
if (mem_id == SPA_ID_INVALID) {
|
||||
mm = ptr = NULL;
|
||||
size = 0;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
mm = pw_mempool_map_id(c->pool, mem_id,
|
||||
PW_MEMMAP_FLAG_READWRITE, offset, size, tag);
|
||||
if (mm == NULL) {
|
||||
|
|
@ -1323,6 +1321,8 @@ static int client_node_set_io(void *object,
|
|||
default:
|
||||
break;
|
||||
}
|
||||
if (old != NULL)
|
||||
pw_memmap_free(old);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -418,18 +418,17 @@ client_node_set_io(void *object,
|
|||
{
|
||||
struct pw_proxy *proxy = object;
|
||||
struct node_data *data = proxy->user_data;
|
||||
struct pw_memmap *mm;
|
||||
struct pw_memmap *old, *mm;
|
||||
void *ptr;
|
||||
uint32_t tag[5] = { data->remote_id, id, };
|
||||
int res;
|
||||
|
||||
if ((mm = pw_mempool_find_tag(data->pool, tag, sizeof(tag))) != NULL)
|
||||
pw_memmap_free(mm);
|
||||
old = pw_mempool_find_tag(data->pool, tag, sizeof(tag));
|
||||
|
||||
if (memid == SPA_ID_INVALID) {
|
||||
mm = ptr = NULL;
|
||||
size = 0;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
mm = pw_mempool_map_id(data->pool, memid,
|
||||
PW_MEMMAP_FLAG_READWRITE, offset, size, tag);
|
||||
if (mm == NULL) {
|
||||
|
|
@ -442,7 +441,12 @@ client_node_set_io(void *object,
|
|||
pw_log_debug("node %p: set io %s %p", proxy,
|
||||
spa_debug_type_find_name(spa_type_io, id), ptr);
|
||||
|
||||
return spa_node_set_io(data->node->node, id, ptr, size);
|
||||
res = spa_node_set_io(data->node->node, id, ptr, size);
|
||||
|
||||
if (old != NULL)
|
||||
pw_memmap_free(old);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
static int client_node_event(void *object, const struct spa_event *event)
|
||||
|
|
@ -840,8 +844,7 @@ client_node_set_activation(void *object,
|
|||
if (memid == SPA_ID_INVALID) {
|
||||
mm = ptr = NULL;
|
||||
size = 0;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
mm = pw_mempool_map_id(data->pool, memid,
|
||||
PW_MEMMAP_FLAG_READWRITE, offset, size, NULL);
|
||||
if (mm == NULL) {
|
||||
|
|
@ -852,7 +855,6 @@ client_node_set_activation(void *object,
|
|||
}
|
||||
pw_log_debug("node %p: set activation %d %p %u %u", node, node_id, ptr, offset, size);
|
||||
|
||||
|
||||
if (ptr) {
|
||||
link = calloc(1, sizeof(struct link));
|
||||
if (link == NULL) {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue