Prevent crash when switchpanel is not initialised.
authorIain Patterson <wm@iain.cx>
Thu, 23 May 2013 12:36:57 +0000 (23 13:36 +0100)
committerCarlos R. Mafra <crmafra@gmail.com>
Thu, 23 May 2013 17:19:45 +0000 (23 18:19 +0100)
A while loop in StartWindozeCycle() was checking the value of the panel
pointer and setting a flag to break out of the loop if it were NULL.
The current iteration of the loop was allowed to continue, however, with
the result that the null pointer could be passed to one of the
switchpanel functions and cause a segfault.

To reproduce, close all windows except one.  Open the inspector and set
the window's "Do not show in the switch panel" flag.  Then close the
inspector and press alt-tab to open the switchpanel.  As there is only
one window and it is not allowed to appear in the switchpanel, a null
panel pointer is returned, then later passed to wSwitchPanelSelectNext()
causing wmaker to crash.

The fix is to break out of the loop immediately instead of setting the
done flag.

src/cycling.c

index 574e0f4..44c4d1e 100644 (file)
@@ -152,7 +152,7 @@ void StartWindozeCycle(WWindow * wwin, XEvent * event, Bool next, Bool class_onl
                modifiers = ev.xkey.state & ValidModMask;
 
                if (!swpanel)
-                       done = True;
+                       break;
 
                switch (ev.type) {