A few fixes to prevent compositor crashes
authorAndy Nichols <andy.nichols@nokia.com>
Tue, 5 Jun 2012 13:41:59 +0000 (15:41 +0200)
committerJørgen Lind <jorgen.lind@nokia.com>
Wed, 6 Jun 2012 08:14:10 +0000 (10:14 +0200)
If a client application exits abruptly while in direct
rendering mode, the surface buffer could reference a null buffer.
We now check for this before attempting to use such a surface
buffer.  It is also possible for WaylandSurfaceNode::preprocess to
be called after WaylandSurfaceItem has called surfaceDestroyed, so
now we check for a valid surface in preprocess as well.

Change-Id: Ibca71349b7a24687944f8b6cd505941b580e0c2a
Reviewed-by: Paul Olav Tvete <paul.tvete@nokia.com>
Reviewed-by: Jørgen Lind <jorgen.lind@nokia.com>
src/compositor/compositor_api/waylandsurfacenode.cpp
src/compositor/wayland_wrapper/wlsurface.cpp
src/compositor/wayland_wrapper/wlsurfacebuffer.cpp

index e657175..a4063cc 100644 (file)
@@ -39,10 +39,12 @@ void WaylandSurfaceNode::preprocess()
 {
     QMutexLocker locker(WaylandSurfaceItem::mutex);
 
-    //Update if the item is dirty and we haven't done an updateTexture for this frame
-    if (m_item && m_item->m_damaged && !m_textureUpdated) {
-        m_item->updateTexture();
-        updateTexture();
+    if (m_item && m_item->surface()) {
+        //Update if the item is dirty and we haven't done an updateTexture for this frame
+        if (m_item->m_damaged && !m_textureUpdated) {
+            m_item->updateTexture();
+            updateTexture();
+        }
     }
     //Reset value for next frame: we have not done updatePaintNode yet
     m_textureUpdated = false;
index 579c27b..ff13e01 100644 (file)
@@ -377,14 +377,16 @@ SurfaceBuffer *Surface::createSurfaceBuffer(struct wl_buffer *buffer)
 bool Surface::postBuffer() {
 #ifdef QT_COMPOSITOR_WAYLAND_GL
     if (m_waylandSurface->handle() == m_compositor->directRenderSurface()) {
-        SurfaceBuffer *surfaceBuffer = m_backBuffer? m_backBuffer : m_frontBuffer;
-        if (surfaceBuffer && m_compositor->pageFlipper()) {
-            if (m_compositor->pageFlipper()->displayBuffer(surfaceBuffer)) {
-                surfaceBuffer->setPageFlipperHasBuffer(true);
-                m_compositor->setDirectRenderingActive(true);
-                return true;
-            } else {
-                qDebug() << "could not post buffer";
+        SurfaceBuffer *surfaceBuffer = currentSurfaceBuffer();
+        if (surfaceBuffer && surfaceBuffer->waylandBufferHandle()) {
+            if (m_compositor->pageFlipper()) {
+                if (m_compositor->pageFlipper()->displayBuffer(surfaceBuffer)) {
+                    surfaceBuffer->setPageFlipperHasBuffer(true);
+                    m_compositor->setDirectRenderingActive(true);
+                    return true;
+                } else {
+                    qDebug() << "could not post buffer";
+                }
             }
         }
     }
index ced3ed2..61e241c 100644 (file)
@@ -199,6 +199,9 @@ void SurfaceBuffer::handleDisplayed()
 
 void *SurfaceBuffer::handle() const
 {
+    if (!m_buffer)
+        return 0;
+
     if (!m_handle) {
         SurfaceBuffer *that = const_cast<SurfaceBuffer *>(this);
         if (isShmBuffer()) {