[PATCH] wayland util: Handle malloc failure in wl_array_copy()
Martin Minarik
minarik11 at student.fiit.stuba.sk
Wed Jul 18 18:45:57 PDT 2012
If the malloc in wl_array_add() fails, we are memcpy-ing to bad memory.
This can happen only when copying array to smaller array.
---
src/wayland-util.c | 11 ++++++++---
src/wayland-util.h | 2 +-
tests/array-test.c | 8 ++++++--
3 files changed, 15 insertions(+), 6 deletions(-)
diff --git a/src/wayland-util.c b/src/wayland-util.c
index a8c03ad..4e02f95 100644
--- a/src/wayland-util.c
+++ b/src/wayland-util.c
@@ -135,12 +135,17 @@ 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 (source->size > array->size) {
+ if (NULL == 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;
diff --git a/tests/array-test.c b/tests/array-test.c
index 7639878..ff5bb8c 100644
--- a/tests/array-test.c
+++ b/tests/array-test.c
@@ -60,7 +60,9 @@ TEST(array_add)
/* add some data */
for (i = 0; i < iterations; i++) {
- struct mydata* ptr = wl_array_add(&array, datasize);
+ struct mydata* ptr = NULL;
+ while (ptr == NULL)
+ ptr = wl_array_add(&array, datasize);
assert((i + 1) * datasize == array.size);
ptr->a = i * 3;
@@ -94,7 +96,9 @@ TEST(array_copy)
/* add some data */
for (i = 0; i < iterations; i++) {
- int *p = wl_array_add(&source, sizeof(int));
+ int *p = NULL;
+ while (p == NULL)
+ p = wl_array_add(&source, sizeof(int));
*p = i * 2 + i;
}
--
1.7.0.4
More information about the wayland-devel
mailing list