[PATCH weston 3/6] noop-renderer: Read the shm buffer contents on attach

Emilio Pozuelo Monfort pochu27 at gmail.com
Thu Feb 6 03:30:33 PST 2014


From: Emilio Pozuelo Monfort <emilio.pozuelo at collabora.co.uk>

The noop-renderer doesn't read buffer contents, which means bad
buffers go undetected. Thus, read the buffer contents just for
the purpose of triggering SIGBUS (and having the client killed).

Fixed bad-buffer test when run against the headless backend.

Signed-off-by: Emilio Pozuelo Monfort <emilio.pozuelo at collabora.co.uk>
---
 src/noop-renderer.c | 21 +++++++++++++++++++--
 1 file changed, 19 insertions(+), 2 deletions(-)

diff --git a/src/noop-renderer.c b/src/noop-renderer.c
index cf1a7f2..5da0b20 100644
--- a/src/noop-renderer.c
+++ b/src/noop-renderer.c
@@ -23,6 +23,7 @@
 #include "config.h"
 
 #include <stdlib.h>
+#include <string.h>
 
 #include "compositor.h"
 
@@ -50,15 +51,31 @@ static void
 noop_renderer_attach(struct weston_surface *es, struct weston_buffer *buffer)
 {
 	struct wl_shm_buffer *shm_buffer;
+	uint8_t *data;
+	uint32_t size, width, height, stride;
 
 	if (!buffer)
 		return;
 
 	shm_buffer = wl_shm_buffer_get(buffer->resource);
 
+	data = wl_shm_buffer_get_data(shm_buffer);
+	stride = wl_shm_buffer_get_stride(shm_buffer);
+	width = wl_shm_buffer_get_width(shm_buffer);
+	height = wl_shm_buffer_get_height(shm_buffer);
+	size = stride * height;
+
+	/* Access the buffer data to make sure the buffer's client gets killed
+	 * if the buffer size is invalid. This makes the bad_buffer test pass.
+	 * This can be removed if we start reading the buffer contents
+	 * somewhere else, e.g. in repaint_output(). */
+	wl_shm_buffer_begin_access(shm_buffer);
+	memset(data, 0, size);
+	wl_shm_buffer_end_access(shm_buffer);
+
 	buffer->shm_buffer = shm_buffer;
-	buffer->width = wl_shm_buffer_get_width(shm_buffer);
-	buffer->height = wl_shm_buffer_get_height(shm_buffer);
+	buffer->width = width;
+	buffer->height = height;
 }
 
 static void
-- 
1.8.5.3



More information about the wayland-devel mailing list