[gtk+] Ensure drawing context is set



commit bb705837bc878b6028069fd7537e89975d50d2ee
Author: Emmanuele Bassi <ebassi gnome org>
Date:   Thu Sep 15 10:05:05 2016 +0100

    Ensure drawing context is set
    
    If somebody decides to use gtk_widget_set_double_buffered() in the
    middle of a draw() then there's the risk of calling end_draw_frame()
    with an invalid pointer.
    
    Some overeager compilers may warn about the double_buffered bit field
    changing values and leading to a potentially uninitialized variable.
    
    In order to avoid compiler warnings or crashes, we can simply store the
    value of the double_buffered bit field at the beginning of the rendering
    and use that instead of the actual bit field.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=771463

 gtk/gtkwidget.c |   10 ++++++++--
 1 files changed, 8 insertions(+), 2 deletions(-)
---
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index 017bbbe..3f48b14 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -17464,8 +17464,14 @@ gtk_widget_render (GtkWidget            *widget,
   gboolean do_clip;
   cairo_t *cr;
   int x, y;
+  gboolean is_double_buffered;
 
-  if (priv->double_buffered)
+  /* We take the value here, in case somebody manages to changes
+   * the double_buffered value inside a ::draw call, and ends up
+   * breaking everything.
+   */
+  is_double_buffered = priv->double_buffered;
+  if (is_double_buffered)
     {
       /* We only render double buffered on native windows */
       if (!gdk_window_has_native (window))
@@ -17492,7 +17498,7 @@ G_GNUC_END_IGNORE_DEPRECATIONS
 
   gtk_widget_draw_internal (widget, cr, do_clip);
 
-  if (priv->double_buffered)
+  if (is_double_buffered)
     gdk_window_end_draw_frame (window, context);
   else
     cairo_destroy (cr);


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