[PATCH weston 2/3] screenshooter: fix various memory handling
Marek Chalupa
mchqwerty at gmail.com
Fri Dec 5 04:49:41 PST 2014
There were unchecked malloc and free of conditionally allocated
memory without checking if the memory was really allocated.
Also simplify error handling in one function.
Signed-off-by: Marek Chalupa <mchqwerty at gmail.com>
---
src/screenshooter.c | 27 +++++++++++++++++++--------
1 file changed, 19 insertions(+), 8 deletions(-)
diff --git a/src/screenshooter.c b/src/screenshooter.c
index 6246cda..b7b1fd0 100644
--- a/src/screenshooter.c
+++ b/src/screenshooter.c
@@ -464,8 +464,11 @@ weston_recorder_free(struct weston_recorder *recorder)
{
if (recorder == NULL)
return;
+
+ if (recorder->tmpbuf)
+ free(recorder->tmpbuf);
+
free(recorder->rect);
- free(recorder->tmpbuf);
free(recorder->frame);
free(recorder);
}
@@ -495,12 +498,16 @@ weston_recorder_create(struct weston_output *output, const char *filename)
if ((recorder->frame == NULL) || (recorder->rect == NULL)) {
weston_log("%s: out of memory\n", __func__);
- weston_recorder_free(recorder);
- return;
+ goto err_recorder;
}
- if (!do_yflip)
+ if (!do_yflip) {
recorder->tmpbuf = malloc(size);
+ if (recorder->tmpbuf == NULL) {
+ weston_log("%s: out of memory\n", __func__);
+ goto err_recorder;
+ }
+ }
header.magic = WCAP_HEADER_MAGIC;
@@ -514,8 +521,7 @@ weston_recorder_create(struct weston_output *output, const char *filename)
break;
default:
weston_log("unknown recorder format\n");
- weston_recorder_free(recorder);
- return;
+ goto err_recorder;
}
recorder->fd = open(filename,
@@ -523,8 +529,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);
- weston_recorder_free(recorder);
- return;
+ goto err_recorder;
}
header.width = output->current_mode->width;
@@ -535,6 +540,12 @@ weston_recorder_create(struct weston_output *output, const char *filename)
wl_signal_add(&output->frame_signal, &recorder->frame_listener);
output->disable_planes++;
weston_output_damage(output);
+
+ return;
+
+err_recorder:
+ weston_recorder_free(recorder);
+ return;
}
static void
--
2.1.0
More information about the wayland-devel
mailing list