mirror of
https://gitlab.freedesktop.org/wayland/wayland.git
synced 2025-11-02 09:01:39 -05:00
Add a "side" field and some sanity checks to wl_map.
The original wl_map implementation did no checking to ensures that ids fell on the correct side of the WL_SERVER_ID_START line. This meant that a client could send the server a server ID and it would happily try to use it. Also, there was no distinction between server-side and client-side in wl_map_remove. Because wl_map_remove added the entry to the free list regardless of which side it came from, the following set of actions would break the map: 1. Client creates a bunch of objects 2. Client deletes one or more of those objects 3. Client does something that causes the server to create an object Because of the problem in wl_map_remove, the server would take an old client-side id, apply the WL_SERVER_ID_START offset, and try to use it as a server-side id regardless of whether or not it was valid. Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
This commit is contained in:
parent
dce104dcc2
commit
28472970df
4 changed files with 32 additions and 15 deletions
|
|
@ -44,14 +44,15 @@
|
|||
struct wl_map {
|
||||
struct wl_array client_entries;
|
||||
struct wl_array server_entries;
|
||||
uint32_t side;
|
||||
uint32_t free_list;
|
||||
};
|
||||
|
||||
typedef void (*wl_iterator_func_t)(void *element, void *data);
|
||||
|
||||
void wl_map_init(struct wl_map *map);
|
||||
void wl_map_init(struct wl_map *map, uint32_t side);
|
||||
void wl_map_release(struct wl_map *map);
|
||||
uint32_t wl_map_insert_new(struct wl_map *map, uint32_t side, void *data);
|
||||
uint32_t wl_map_insert_new(struct wl_map *map, void *data);
|
||||
int wl_map_insert_at(struct wl_map *map, uint32_t i, void *data);
|
||||
int wl_map_reserve_new(struct wl_map *map, uint32_t i);
|
||||
void wl_map_remove(struct wl_map *map, uint32_t i);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue