mirror of
https://gitlab.freedesktop.org/pipewire/pipewire
synced 2024-10-06 16:09:43 +00:00
map: make _insert_at() fail on a removed item
You are only supposed to use _insert_new()/_remove() or _insert_at() on the map, If we detect a _insert_at() to a removed item, return an error because else we might corrupt the free list. Update unit test accordingly.
This commit is contained in:
parent
d5825b8551
commit
c07f0ccb71
|
@ -182,20 +182,9 @@ static inline int pw_map_insert_at(struct pw_map *map, uint32_t id, void *data)
|
|||
if (item == NULL)
|
||||
return -errno;
|
||||
} else {
|
||||
if (pw_map_id_is_free(map, id)) {
|
||||
uint32_t *current = &map->free_list;
|
||||
while (*current != SPA_ID_INVALID) {
|
||||
uint32_t current_id = (*current) >> 1;
|
||||
uint32_t *next = &pw_map_get_item(map, current_id)->next;
|
||||
|
||||
if (current_id == id) {
|
||||
*current = *next;
|
||||
break;
|
||||
}
|
||||
current = next;
|
||||
}
|
||||
}
|
||||
item = pw_map_get_item(map, id);
|
||||
if (pw_map_item_is_free(item))
|
||||
return -EINVAL;
|
||||
}
|
||||
item->data = data;
|
||||
return 0;
|
||||
|
|
|
@ -188,7 +188,6 @@ PWTEST(map_insert_at_free)
|
|||
int data[3] = {1, 2, 3};
|
||||
int new_data = 4;
|
||||
int *ptr[3] = {&data[0], &data[1], &data[3]};
|
||||
int *new_ptr = &new_data;
|
||||
int idx[3];
|
||||
int rc;
|
||||
|
||||
|
@ -225,21 +224,7 @@ PWTEST(map_insert_at_free)
|
|||
}
|
||||
|
||||
rc = pw_map_insert_at(&map, item_idx, &new_data);
|
||||
pwtest_neg_errno_ok(rc);
|
||||
pwtest_ptr_eq(new_ptr, pw_map_lookup(&map, item_idx));
|
||||
|
||||
if (before_idx != SKIP && before_idx != item_idx) {
|
||||
rc = pw_map_insert_at(&map, before_idx, &ptr[before_idx]);
|
||||
pwtest_neg_errno_ok(rc);
|
||||
pwtest_ptr_eq(&ptr[before_idx], pw_map_lookup(&map, before_idx));
|
||||
}
|
||||
|
||||
if (after_idx != SKIP && after_idx != item_idx) {
|
||||
rc = pw_map_insert_at(&map, after_idx, &ptr[after_idx]);
|
||||
pwtest_neg_errno_ok(rc);
|
||||
pwtest_ptr_eq(&ptr[after_idx], pw_map_lookup(&map, after_idx));
|
||||
}
|
||||
|
||||
pwtest_neg_errno(rc, -EINVAL);
|
||||
pw_map_clear(&map);
|
||||
|
||||
return PWTEST_PASS;
|
||||
|
|
Loading…
Reference in a new issue