From 7193938d27d7ad5303e1acc016530dda1c3692b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Sat, 9 Nov 2019 23:26:00 +0100 Subject: [PATCH] compositor: Guard against untimely calls It seems that sometimes these functions are called by Javascript in GNOME Shell during tear down. This causes segfaults and crash reports, but without any backtraces other than the entry and exit points into gjs. In order to get more useful information about where these calls come from, validate the input passed gracefully, by complaining in the log and returning NULL values. https://gitlab.gnome.org/GNOME/mutter/merge_requests/926 --- src/compositor/compositor.c | 55 +++++++++++++++++++++++++++---------- 1 file changed, 40 insertions(+), 15 deletions(-) diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c index 30a7a3824..f6734da2d 100644 --- a/src/compositor/compositor.c +++ b/src/compositor/compositor.c @@ -210,9 +210,14 @@ get_compositor_for_display (MetaDisplay *display) ClutterActor * meta_get_stage_for_display (MetaDisplay *display) { - MetaCompositor *compositor = get_compositor_for_display (display); - MetaCompositorPrivate *priv = - meta_compositor_get_instance_private (compositor); + MetaCompositor *compositor; + MetaCompositorPrivate *priv; + + g_return_val_if_fail (display, NULL); + + compositor = get_compositor_for_display (display); + g_return_val_if_fail (compositor, NULL); + priv = meta_compositor_get_instance_private (compositor); return priv->stage; } @@ -226,9 +231,14 @@ meta_get_stage_for_display (MetaDisplay *display) ClutterActor * meta_get_window_group_for_display (MetaDisplay *display) { - MetaCompositor *compositor = get_compositor_for_display (display); - MetaCompositorPrivate *priv = - meta_compositor_get_instance_private (compositor); + MetaCompositor *compositor; + MetaCompositorPrivate *priv; + + g_return_val_if_fail (display, NULL); + + compositor = get_compositor_for_display (display); + g_return_val_if_fail (compositor, NULL); + priv = meta_compositor_get_instance_private (compositor); return priv->window_group; } @@ -242,9 +252,14 @@ meta_get_window_group_for_display (MetaDisplay *display) ClutterActor * meta_get_top_window_group_for_display (MetaDisplay *display) { - MetaCompositor *compositor = get_compositor_for_display (display); - MetaCompositorPrivate *priv = - meta_compositor_get_instance_private (compositor); + MetaCompositor *compositor; + MetaCompositorPrivate *priv; + + g_return_val_if_fail (display, NULL); + + compositor = get_compositor_for_display (display); + g_return_val_if_fail (compositor, NULL); + priv = meta_compositor_get_instance_private (compositor); return priv->top_window_group; } @@ -258,9 +273,14 @@ meta_get_top_window_group_for_display (MetaDisplay *display) ClutterActor * meta_get_feedback_group_for_display (MetaDisplay *display) { - MetaCompositor *compositor = get_compositor_for_display (display); - MetaCompositorPrivate *priv = - meta_compositor_get_instance_private (compositor); + MetaCompositor *compositor; + MetaCompositorPrivate *priv; + + g_return_val_if_fail (display, NULL); + + compositor = get_compositor_for_display (display); + g_return_val_if_fail (compositor, NULL); + priv = meta_compositor_get_instance_private (compositor); return priv->feedback_group; } @@ -274,9 +294,14 @@ meta_get_feedback_group_for_display (MetaDisplay *display) GList * meta_get_window_actors (MetaDisplay *display) { - MetaCompositor *compositor = get_compositor_for_display (display); - MetaCompositorPrivate *priv = - meta_compositor_get_instance_private (compositor); + MetaCompositor *compositor; + MetaCompositorPrivate *priv; + + g_return_val_if_fail (display, NULL); + + compositor = get_compositor_for_display (display); + g_return_val_if_fail (compositor, NULL); + priv = meta_compositor_get_instance_private (compositor); return priv->windows; }