[gtk/gtk-3-24: 1/3] cssnode: Bail out nicely if there is no settings




commit cec7ff1ba7f7c934ac8396d74df7d4309a77aaf9
Author: Olivier Fourdan <ofourdan redhat com>
Date:   Wed Sep 30 14:59:07 2020 +0200

    cssnode: Bail out nicely if there is no settings
    
    On gdk_display_close(), the GtkSettings attached to the display are
    freed.
    
    Yet the gtk CSS code may still be called from the widget unparent,
    leading to a segfault.
    
    Check if the GtkSettings is not NULL and bail out nicely if not.
    
    Closes: https://gitlab.gnome.org/GNOME/gtk/-/issues/2780

 gtk/gtkcssnode.c       | 7 ++++++-
 gtk/gtkcsswidgetnode.c | 5 +++++
 2 files changed, 11 insertions(+), 1 deletion(-)
---
diff --git a/gtk/gtkcssnode.c b/gtk/gtkcssnode.c
index 42d9eb6c6c..3567b3ed77 100644
--- a/gtk/gtkcssnode.c
+++ b/gtk/gtkcssnode.c
@@ -1432,6 +1432,7 @@ GtkStyleProviderPrivate *
 gtk_css_node_get_style_provider (GtkCssNode *cssnode)
 {
   GtkStyleProviderPrivate *result;
+  GtkSettings *settings;
 
   result = gtk_css_node_get_style_provider_or_null (cssnode);
   if (result)
@@ -1440,7 +1441,11 @@ gtk_css_node_get_style_provider (GtkCssNode *cssnode)
   if (cssnode->parent)
     return gtk_css_node_get_style_provider (cssnode->parent);
 
-  return GTK_STYLE_PROVIDER_PRIVATE (_gtk_settings_get_style_cascade (gtk_settings_get_default (), 1));
+  settings = gtk_settings_get_default ();
+  if (!settings)
+    return NULL;
+
+  return GTK_STYLE_PROVIDER_PRIVATE (_gtk_settings_get_style_cascade (settings, 1));
 }
 
 void
diff --git a/gtk/gtkcsswidgetnode.c b/gtk/gtkcsswidgetnode.c
index 575e3ca46b..2d65b266db 100644
--- a/gtk/gtkcsswidgetnode.c
+++ b/gtk/gtkcsswidgetnode.c
@@ -235,6 +235,7 @@ gtk_css_widget_node_get_style_provider (GtkCssNode *node)
   GtkCssWidgetNode *widget_node = GTK_CSS_WIDGET_NODE (node);
   GtkStyleContext *context;
   GtkStyleCascade *cascade;
+  GtkSettings *settings;
 
   if (widget_node->widget == NULL)
     return NULL;
@@ -243,6 +244,10 @@ gtk_css_widget_node_get_style_provider (GtkCssNode *node)
   if (context)
     return gtk_style_context_get_style_provider (context);
 
+  settings = gtk_widget_get_settings (widget_node->widget);
+  if (!settings)
+    return NULL;
+
   cascade = _gtk_settings_get_style_cascade (gtk_widget_get_settings (widget_node->widget),
                                              gtk_widget_get_scale_factor (widget_node->widget));
   return GTK_STYLE_PROVIDER_PRIVATE (cascade);


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