[mutter] wayland: Survive an unsupported buffer size



commit 1f570d542ee7d703cf9f272183115f9df0a92b8c
Author: Olivier Fourdan <ofourdan redhat com>
Date:   Fri Aug 26 09:41:59 2016 +0200

    wayland: Survive an unsupported buffer size
    
    If cogl fails to create a texture from the client's given buffer,
    mutter would raise a fatal error and terminate.
    
    As a result, a broken client might kill gnome-shell/mutter and take the
    entire Wayland session with it.
    
    Instead of raising a fatal error in this case, log the cogl error
    message and send the client an OOM error, so mutter/gnome-shell can
    survive an unsupported buffer size.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=770387

 src/wayland/meta-wayland-buffer.c  |    4 +++-
 src/wayland/meta-wayland-surface.c |    9 +++++++++
 2 files changed, 12 insertions(+), 1 deletions(-)
---
diff --git a/src/wayland/meta-wayland-buffer.c b/src/wayland/meta-wayland-buffer.c
index 8c41e81..b23ca35 100644
--- a/src/wayland/meta-wayland-buffer.c
+++ b/src/wayland/meta-wayland-buffer.c
@@ -106,8 +106,10 @@ meta_wayland_buffer_ensure_texture (MetaWaylandBuffer *buffer)
 
   if (!texture)
     {
+      meta_warning ("Could not import pending buffer, ignoring commit: %s\n",
+                    catch_error->message);
       cogl_error_free (catch_error);
-      meta_fatal ("Could not import pending buffer, ignoring commit\n");
+      goto out;
     }
 
   buffer->texture = texture;
diff --git a/src/wayland/meta-wayland-surface.c b/src/wayland/meta-wayland-surface.c
index 031229d..ffa6e2e 100644
--- a/src/wayland/meta-wayland-surface.c
+++ b/src/wayland/meta-wayland-surface.c
@@ -735,6 +735,14 @@ apply_pending_state (MetaWaylandSurface      *surface,
           CoglTexture *texture;
 
           texture = meta_wayland_buffer_ensure_texture (pending->buffer);
+          if (!texture)
+            {
+              wl_resource_post_error (surface->resource, WL_DISPLAY_ERROR_NO_MEMORY,
+                              "Failed to create a texture for surface %i",
+                              wl_resource_get_id (surface->resource));
+
+              goto cleanup;
+            }
           meta_surface_actor_wayland_set_texture (surface_actor_wayland,
                                                   texture);
         }
@@ -804,6 +812,7 @@ apply_pending_state (MetaWaylandSurface      *surface,
         }
     }
 
+cleanup:
   /* If we have a buffer that we are not using, decrease the use count so it may
    * be released if no-one else has a use-reference to it.
    */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]