diff options
author | Olivier Fourdan <ofourdan@redhat.com> | 2020-09-30 14:59:07 +0200 |
---|---|---|
committer | Olivier Fourdan <ofourdan@redhat.com> | 2020-09-30 15:22:15 +0200 |
commit | cec7ff1ba7f7c934ac8396d74df7d4309a77aaf9 (patch) | |
tree | 31bd062668cdfcf01b184a215449340edc1784e1 | |
parent | 88e8a5272e4420f8040bc2cbb5be3855a0f9ee4e (diff) | |
download | gtk+-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.c | 7 | ||||
-rw-r--r-- | gtk/gtkcsswidgetnode.c | 5 |
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); |