From 0c5a6ad775632356d6c35991ebad1b04ee0b8b68 Mon Sep 17 00:00:00 2001 From: Giovanni Campagna Date: Sat, 14 Dec 2013 14:24:27 +0100 Subject: [PATCH] window: don't set _NET_WM_FULLSCREEN_MONITORS to bogus values Prior to the DisplayConfig merge, we would set _NET_WM_FULLSCREEN_MONITORS to (unsigned)-1 when unset. After that, we would have invalid reads inside meta_screen_monitor_index_to_xinerama_index() (called with -1). The way I read the specification, the proper way to indicate that the window is back to fullscreen on all monitors is to remove the property, so do that. Also, add an assertion that meta_screne_monitor_index_to_xinerama_index() is doing the right thing. https://bugzilla.gnome.org/show_bug.cgi?id=724258 --- src/core/screen.c | 2 ++ src/core/window-x11.c | 44 +++++++++++++++++++++++++++---------------- 2 files changed, 30 insertions(+), 16 deletions(-) diff --git a/src/core/screen.c b/src/core/screen.c index e8e8c56e0..c68ee10ff 100644 --- a/src/core/screen.c +++ b/src/core/screen.c @@ -389,6 +389,8 @@ int meta_screen_monitor_index_to_xinerama_index (MetaScreen *screen, int index) { + g_return_val_if_fail (index >= 0 && index < screen->n_monitor_infos, -1); + meta_screen_ensure_xinerama_indices (screen); return screen->monitor_infos[index].xinerama_index; diff --git a/src/core/window-x11.c b/src/core/window-x11.c index d984a59c3..150390a65 100644 --- a/src/core/window-x11.c +++ b/src/core/window-x11.c @@ -127,23 +127,35 @@ meta_window_x11_set_net_wm_state (MetaWindow *window) if (window->fullscreen) { - data[0] = meta_screen_monitor_index_to_xinerama_index (window->screen, - window->fullscreen_monitors[0]); - data[1] = meta_screen_monitor_index_to_xinerama_index (window->screen, - window->fullscreen_monitors[1]); - data[2] = meta_screen_monitor_index_to_xinerama_index (window->screen, - window->fullscreen_monitors[2]); - data[3] = meta_screen_monitor_index_to_xinerama_index (window->screen, - window->fullscreen_monitors[3]); + if (window->fullscreen_monitors[0] >= 0) + { + data[0] = meta_screen_monitor_index_to_xinerama_index (window->screen, + window->fullscreen_monitors[0]); + data[1] = meta_screen_monitor_index_to_xinerama_index (window->screen, + window->fullscreen_monitors[1]); + data[2] = meta_screen_monitor_index_to_xinerama_index (window->screen, + window->fullscreen_monitors[2]); + data[3] = meta_screen_monitor_index_to_xinerama_index (window->screen, + window->fullscreen_monitors[3]); - meta_verbose ("Setting _NET_WM_FULLSCREEN_MONITORS\n"); - meta_error_trap_push (window->display); - XChangeProperty (window->display->xdisplay, - window->xwindow, - window->display->atom__NET_WM_FULLSCREEN_MONITORS, - XA_CARDINAL, 32, PropModeReplace, - (guchar*) data, 4); - meta_error_trap_pop (window->display); + meta_verbose ("Setting _NET_WM_FULLSCREEN_MONITORS\n"); + meta_error_trap_push (window->display); + XChangeProperty (window->display->xdisplay, + window->xwindow, + window->display->atom__NET_WM_FULLSCREEN_MONITORS, + XA_CARDINAL, 32, PropModeReplace, + (guchar*) data, 4); + meta_error_trap_pop (window->display); + } + else + { + meta_verbose ("Clearing _NET_WM_FULLSCREEN_MONITORS\n"); + meta_error_trap_push (window->display); + XDeleteProperty (window->display->xdisplay, + window->xwindow, + window->display->atom__NET_WM_FULLSCREEN_MONITORS); + meta_error_trap_pop (window->display); + } } }