diff options
author | Andy Nichols <andy.nichols@nokia.com> | 2012-06-05 15:41:59 +0200 |
---|---|---|
committer | Jørgen Lind <jorgen.lind@nokia.com> | 2012-06-06 10:14:10 +0200 |
commit | 077067bc8f68a3146430b941ea0f0daa61781f91 (patch) | |
tree | 46502496fab3f8949f3c73e7e6af8df734d3c532 /src/compositor/wayland_wrapper/wlsurface.cpp | |
parent | 123efe5eb255cf0e2408dff3022cf3e0115a11e7 (diff) |
A few fixes to prevent compositor crashes
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>
Diffstat (limited to 'src/compositor/wayland_wrapper/wlsurface.cpp')
-rw-r--r-- | src/compositor/wayland_wrapper/wlsurface.cpp | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/src/compositor/wayland_wrapper/wlsurface.cpp b/src/compositor/wayland_wrapper/wlsurface.cpp index 579c27bd1..ff13e017a 100644 --- a/src/compositor/wayland_wrapper/wlsurface.cpp +++ b/src/compositor/wayland_wrapper/wlsurface.cpp @@ -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"; + } } } } |