This wraps all accesses to an SHM buffer between wl_shm_buffer_begin and end so that wayland-shm can install a handler for SIGBUS and catch attempts to pass the compositor a buffer that is too small.
Note, this patch doesn't do anything to fix the pixman renderer. --- src/compositor-drm.c | 3 +++ src/gl-renderer.c | 6 ++++++ src/pixman-renderer.c | 2 ++ src/rpi-renderer.c | 4 ++++ src/screenshooter.c | 4 ++++ 5 files changed, 19 insertions(+) diff --git a/src/compositor-drm.c b/src/compositor-drm.c index 2770c85..180c3ee 100644 --- a/src/compositor-drm.c +++ b/src/compositor-drm.c @@ -964,9 +964,12 @@ drm_output_set_cursor(struct drm_output *output) memset(buf, 0, sizeof buf); stride = wl_shm_buffer_get_stride(es->buffer_ref.buffer->shm_buffer); s = wl_shm_buffer_get_data(es->buffer_ref.buffer->shm_buffer); + + wl_shm_buffer_begin_access(es->buffer_ref.buffer->shm_buffer); for (i = 0; i < es->geometry.height; i++) memcpy(buf + i * 64, s + i * stride, es->geometry.width * 4); + wl_shm_buffer_end_access(es->buffer_ref.buffer->shm_buffer); if (gbm_bo_write(bo, buf, sizeof buf) < 0) weston_log("failed update cursor: %m\n"); diff --git a/src/gl-renderer.c b/src/gl-renderer.c index ae69f22..90e8148 100644 --- a/src/gl-renderer.c +++ b/src/gl-renderer.c @@ -875,10 +875,12 @@ gl_renderer_flush_damage(struct weston_surface *surface) glBindTexture(GL_TEXTURE_2D, gs->textures[0]); if (!gr->has_unpack_subimage) { + wl_shm_buffer_begin_access(buffer->shm_buffer); glTexImage2D(GL_TEXTURE_2D, 0, format, gs->pitch, buffer->height, 0, format, pixel_type, wl_shm_buffer_get_data(buffer->shm_buffer)); + wl_shm_buffer_end_access(buffer->shm_buffer); goto done; } @@ -890,13 +892,16 @@ gl_renderer_flush_damage(struct weston_surface *surface) if (gs->needs_full_upload) { glPixelStorei(GL_UNPACK_SKIP_PIXELS_EXT, 0); glPixelStorei(GL_UNPACK_SKIP_ROWS_EXT, 0); + wl_shm_buffer_begin_access(buffer->shm_buffer); glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, gs->pitch, buffer->height, format, pixel_type, data); + wl_shm_buffer_end_access(buffer->shm_buffer); goto done; } rectangles = pixman_region32_rectangles(&gs->texture_damage, &n); + wl_shm_buffer_begin_access(buffer->shm_buffer); for (i = 0; i < n; i++) { pixman_box32_t r; @@ -908,6 +913,7 @@ gl_renderer_flush_damage(struct weston_surface *surface) r.x2 - r.x1, r.y2 - r.y1, format, pixel_type, data); } + wl_shm_buffer_end_access(buffer->shm_buffer); #endif done: diff --git a/src/pixman-renderer.c b/src/pixman-renderer.c index 987c539..80d41a8 100644 --- a/src/pixman-renderer.c +++ b/src/pixman-renderer.c @@ -574,6 +574,8 @@ pixman_renderer_attach(struct weston_surface *es, struct weston_buffer *buffer) buffer->width = wl_shm_buffer_get_width(shm_buffer); buffer->height = wl_shm_buffer_get_height(shm_buffer); + /* XXX what about wl_shm_buffer_begin_access? */ + ps->image = pixman_image_create_bits(pixman_format, buffer->width, buffer->height, wl_shm_buffer_get_data(shm_buffer), diff --git a/src/rpi-renderer.c b/src/rpi-renderer.c index 3ba5fc4..a964899 100644 --- a/src/rpi-renderer.c +++ b/src/rpi-renderer.c @@ -277,6 +277,8 @@ rpi_resource_update(struct rpi_resource *resource, struct weston_buffer *buffer, pixman_region32_intersect(&write_region, &write_region, region); + wl_shm_buffer_begin_access(buffer->shm_buffer); + #ifdef HAVE_RESOURCE_WRITE_DATA_RECT /* XXX: Can this do a format conversion, so that scanout does not have to? */ r = pixman_region32_rectangles(&write_region, &n); @@ -311,6 +313,8 @@ rpi_resource_update(struct rpi_resource *resource, struct weston_buffer *buffer, width, r->y2 - r->y1, 0, r->y1, ret); #endif + wl_shm_buffer_end_access(buffer->shm_buffer); + pixman_region32_fini(&write_region); return ret ? -1 : 0; diff --git a/src/screenshooter.c b/src/screenshooter.c index 645114d..0c657bc 100644 --- a/src/screenshooter.c +++ b/src/screenshooter.c @@ -144,6 +144,8 @@ screenshooter_frame_notify(struct wl_listener *listener, void *data) d = wl_shm_buffer_get_data(l->buffer->shm_buffer); s = pixels + stride * (l->buffer->height - 1); + wl_shm_buffer_begin_access(l->buffer->shm_buffer); + switch (compositor->read_format) { case PIXMAN_a8r8g8b8: case PIXMAN_x8r8g8b8: @@ -163,6 +165,8 @@ screenshooter_frame_notify(struct wl_listener *listener, void *data) break; } + wl_shm_buffer_end_access(l->buffer->shm_buffer); + screenshooter_send_done(l->resource); free(pixels); free(l); -- 1.8.3.1 _______________________________________________ wayland-devel mailing list wayland-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/wayland-devel