summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier Fourdan <ofourdan@redhat.com>2020-09-30 14:59:07 +0200
committerOlivier Fourdan <ofourdan@redhat.com>2020-09-30 15:22:15 +0200
commitcec7ff1ba7f7c934ac8396d74df7d4309a77aaf9 (patch)
tree31bd062668cdfcf01b184a215449340edc1784e1
parent88e8a5272e4420f8040bc2cbb5be3855a0f9ee4e (diff)
downloadgtk+-cec7ff1ba7f7c934ac8396d74df7d4309a77aaf9.tar.gz
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
-rw-r--r--gtk/gtkcssnode.c7
-rw-r--r--gtk/gtkcsswidgetnode.c5
2 files changed, 11 insertions, 1 deletions
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);