[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