From bfd74f40f3804a42a9135b3aef01f626372153ab Mon Sep 17 00:00:00 2001 From: "Bryce W. Harrington" Date: Mon, 21 Apr 2014 23:51:02 +0000 Subject: [PATCH] Check zalloc return for out of memory situation 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 --- src/compositor-wayland.c | 6 ++++++ src/libinput-seat.c | 2 +- src/screenshooter.c | 33 ++++++++++++++++++++------------- src/udev-seat.c | 2 +- 4 files changed, 28 insertions(+), 15 deletions(-) diff --git a/src/compositor-wayland.c b/src/compositor-wayland.c index f35db9c3..67f15be9 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 8bf538c0..acb29d78 100644 --- a/src/libinput-seat.c +++ b/src/libinput-seat.c @@ -330,9 +330,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/screenshooter.c b/src/screenshooter.c index 02146c89..369e9204 100644 --- a/src/screenshooter.c +++ b/src/screenshooter.c @@ -449,6 +449,17 @@ weston_recorder_frame_notify(struct wl_listener *listener, void *data) weston_recorder_destroy(recorder); } +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) { @@ -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 5e018de8..cd2f6a90 100644 --- a/src/udev-seat.c +++ b/src/udev-seat.c @@ -373,9 +373,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;