[PATCH 1/3] Check zalloc return for out of memory situation
Bryce W. Harrington
b.harrington at samsung.com
Mon Apr 21 16:51:02 PDT 2014
Most zalloc calls in weston are checked, this fixes a handful that were
being ignored. As found by `grep -EIsr "[^x]zalloc\(" . -A1`
Signed-off-by: Bryce Harrington <b.harrington at samsung.com>
---
src/compositor-wayland.c | 6 ++++++
src/libinput-seat.c | 2 +-
src/screen-share.c | 8 +++++++-
src/screenshooter.c | 33 ++++++++++++++++++++-------------
src/udev-seat.c | 2 +-
5 files changed, 35 insertions(+), 16 deletions(-)
diff --git a/src/compositor-wayland.c b/src/compositor-wayland.c
index f35db9c..67f15be 100644
--- a/src/compositor-wayland.c
+++ b/src/compositor-wayland.c
@@ -256,6 +256,12 @@ wayland_output_get_shm_buffer(struct wayland_output *output)
}
sb = zalloc(sizeof *sb);
+ if (sb == NULL) {
+ weston_log("could not zalloc %ld memory for sb: %m\n", sizeof *sb);
+ close(fd);
+ free(data);
+ return NULL;
+ }
sb->output = output;
wl_list_init(&sb->free_link);
diff --git a/src/libinput-seat.c b/src/libinput-seat.c
index b6adc76..b2090fa 100644
--- a/src/libinput-seat.c
+++ b/src/libinput-seat.c
@@ -313,9 +313,9 @@ udev_seat_create(struct udev_input *input, const char *seat_name)
struct udev_seat *seat;
seat = zalloc(sizeof *seat);
-
if (!seat)
return NULL;
+
weston_seat_init(&seat->base, c, seat_name);
seat->base.led_update = udev_seat_led_update;
diff --git a/src/screen-share.c b/src/screen-share.c
index 5de20be..924672e 100644
--- a/src/screen-share.c
+++ b/src/screen-share.c
@@ -433,12 +433,18 @@ shared_output_get_shm_buffer(struct shared_output *so)
data = mmap(NULL, height * stride, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (data == MAP_FAILED) {
- weston_log("mmap: %m");
+ weston_log("could not mmap %d memory for data: %m\n", height * stride);
close(fd);
return NULL;
}
sb = zalloc(sizeof *sb);
+ if (sb == NULL) {
+ weston_log("could not zalloc %d memory for sb: %m\n", sizeof *sb);
+ close(fd);
+ free(data);
+ return NULL;
+ }
sb->output = so;
wl_list_init(&sb->free_link);
diff --git a/src/screenshooter.c b/src/screenshooter.c
index 02146c8..369e920 100644
--- a/src/screenshooter.c
+++ b/src/screenshooter.c
@@ -450,6 +450,17 @@ weston_recorder_frame_notify(struct wl_listener *listener, void *data)
}
static void
+weston_recorder_free(struct weston_recorder *recorder)
+{
+ if (recorder == NULL)
+ return;
+ free(recorder->rect);
+ free(recorder->tmpbuf);
+ free(recorder->frame);
+ free(recorder);
+}
+
+static void
weston_recorder_create(struct weston_output *output, const char *filename)
{
struct weston_compositor *compositor = output->compositor;
@@ -461,7 +472,6 @@ weston_recorder_create(struct weston_output *output, const char *filename)
do_yflip = !!(compositor->capabilities & WESTON_CAP_CAPTURE_YFLIP);
recorder = malloc(sizeof *recorder);
-
if (recorder == NULL) {
weston_log("%s: out of memory\n", __func__);
return;
@@ -476,6 +486,12 @@ weston_recorder_create(struct weston_output *output, const char *filename)
recorder->destroying = 0;
recorder->output = output;
+ if ((recorder->frame == NULL) || (recorder->rect == NULL)) {
+ weston_log("%s: out of memory\n", __func__);
+ weston_recorder_free(recorder);
+ return;
+ }
+
if (do_yflip)
recorder->tmpbuf = NULL;
else
@@ -493,10 +509,7 @@ weston_recorder_create(struct weston_output *output, const char *filename)
break;
default:
weston_log("unknown recorder format\n");
- free(recorder->rect);
- free(recorder->tmpbuf);
- free(recorder->frame);
- free(recorder);
+ weston_recorder_free(recorder);
return;
}
@@ -505,10 +518,7 @@ weston_recorder_create(struct weston_output *output, const char *filename)
if (recorder->fd < 0) {
weston_log("problem opening output file %s: %m\n", filename);
- free(recorder->rect);
- free(recorder->tmpbuf);
- free(recorder->frame);
- free(recorder);
+ weston_recorder_free(recorder);
return;
}
@@ -527,11 +537,8 @@ weston_recorder_destroy(struct weston_recorder *recorder)
{
wl_list_remove(&recorder->frame_listener.link);
close(recorder->fd);
- free(recorder->tmpbuf);
- free(recorder->frame);
- free(recorder->rect);
recorder->output->disable_planes--;
- free(recorder);
+ weston_recorder_free(recorder);
}
static void
diff --git a/src/udev-seat.c b/src/udev-seat.c
index 7e4330a..59bf1da 100644
--- a/src/udev-seat.c
+++ b/src/udev-seat.c
@@ -372,9 +372,9 @@ udev_seat_create(struct udev_input *input, const char *seat_name)
struct udev_seat *seat;
seat = zalloc(sizeof *seat);
-
if (!seat)
return NULL;
+
weston_seat_init(&seat->base, c, seat_name);
seat->base.led_update = drm_led_update;
--
1.7.9.5
More information about the wayland-devel
mailing list