evas/wayland_shm: Change the buffer sent comparison.
authorRafael Antognolli <rafael.antognolli@linux.intel.com>
Fri, 8 Mar 2013 17:50:02 +0000 (14:50 -0300)
committerRafael Antognolli <rafael.antognolli@linux.intel.com>
Fri, 8 Mar 2013 17:54:18 +0000 (14:54 -0300)
Using the wb->buffer pointer to compare if a buffer was already sent is
bad, since the buffer pointer can be changed in a way that that
comparison is true, even if different buffers are used.

When requesting a new buffer to the wl_shm_pool, it can return the
buffer address of a previously freed buffer. This reused buffer pointer
can be the same as the last buffer sent to the compositor, and the
comparison will be true, skipping a new wl_buffer_attach.

src/modules/evas/engines/wayland_shm/evas_swapper.c

index d7cf6e6..49d7cce 100644 (file)
@@ -427,7 +427,7 @@ static void
 _evas_swapper_buffer_put(Wl_Swapper *ws, Wl_Buffer *wb, Eina_Rectangle *rects, unsigned int count)
 {
    Eina_Rectangle *rect;
-   static struct wl_buffer *sent;
+   static Wl_Buffer *sent = NULL;
 
    LOGFN(__FILE__, __LINE__, __FUNCTION__);
 
@@ -469,12 +469,12 @@ _evas_swapper_buffer_put(Wl_Swapper *ws, Wl_Buffer *wb, Eina_Rectangle *rects, u
      }
 
    /* surface attach */
-   if (sent != wb->buffer)
+   if (sent != wb)
      {
         wl_surface_attach(ws->surface, wb->buffer, ws->dx, ws->dy);
         ws->dx = 0;
         ws->dy = 0;
-        sent = wb->buffer;
+        sent = wb;
      }
 
    /* surface damage */