From 0d5850e6d67a09a670625dfb99ec9efefdafb75f Mon Sep 17 00:00:00 2001 From: David Herrmann Date: Thu, 11 Oct 2012 23:37:43 +0200 Subject: [PATCH] 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 --- src/wayland-util.c | 12 +++++++++--- 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 eacf9026..158f5a52 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 b588505e..f54077ed 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;