diff options
| author | David Herrmann <dh.herrmann@googlemail.com> | 2012-10-11 23:37:43 +0200 |
|---|---|---|
| committer | Kristian Høgsberg <krh@bitplanet.net> | 2012-10-15 16:06:15 -0400 |
| commit | 0d5850e6d67a09a670625dfb99ec9efefdafb75f (patch) | |
| tree | 426b1efc6b6328b1b0ea45608a6a52d0ec163f1a | |
| parent | wayland-client: add wl_display_get_error() (diff) | |
| download | wayland-0d5850e6d67a09a670625dfb99ec9efefdafb75f.tar wayland-0d5850e6d67a09a670625dfb99ec9efefdafb75f.tar.gz wayland-0d5850e6d67a09a670625dfb99ec9efefdafb75f.tar.bz2 wayland-0d5850e6d67a09a670625dfb99ec9efefdafb75f.tar.lz wayland-0d5850e6d67a09a670625dfb99ec9efefdafb75f.tar.xz wayland-0d5850e6d67a09a670625dfb99ec9efefdafb75f.tar.zst wayland-0d5850e6d67a09a670625dfb99ec9efefdafb75f.zip | |
wayland-util: return -1 if wl_array_copy() fails
We might have to perform memory allocations in wl_array_copy(), so catch
out-of-memory errors in wl_array_add() and return -1 before changing any
state.
Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
| -rw-r--r-- | src/wayland-util.c | 12 | ||||
| -rw-r--r-- | src/wayland-util.h | 2 |
2 files changed, 10 insertions, 4 deletions
diff --git a/src/wayland-util.c b/src/wayland-util.c index eacf902..158f5a5 100644 --- a/src/wayland-util.c +++ b/src/wayland-util.c @@ -132,12 +132,18 @@ wl_array_add(struct wl_array *array, size_t size) return p; } -WL_EXPORT void +WL_EXPORT int wl_array_copy(struct wl_array *array, struct wl_array *source) { - array->size = 0; - wl_array_add(array, source->size); + if (array->size < source->size) { + if (!wl_array_add(array, source->size - array->size)) + return -1; + } else { + array->size = source->size; + } + memcpy(array->data, source->data, source->size); + return 0; } union map_entry { diff --git a/src/wayland-util.h b/src/wayland-util.h index b588505..f54077e 100644 --- a/src/wayland-util.h +++ b/src/wayland-util.h @@ -165,7 +165,7 @@ struct wl_array { void wl_array_init(struct wl_array *array); void wl_array_release(struct wl_array *array); void *wl_array_add(struct wl_array *array, size_t size); -void wl_array_copy(struct wl_array *array, struct wl_array *source); +int wl_array_copy(struct wl_array *array, struct wl_array *source); typedef int32_t wl_fixed_t; |
