From f6346e6019fdca0549d344a27ff3ce31c3c826ae Mon Sep 17 00:00:00 2001 From: Kim Woelders Date: Sun, 5 Jun 2011 20:56:46 +0000 Subject: [PATCH] Fix potential crash during manual window placement. Test case: Run while true; do xterm -e false; done and move pointer. Noted by Daniel Manjarres. SVN revision: 59977 --- src/ewins.c | 3 +++ src/moveresize.c | 12 +++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/ewins.c b/src/ewins.c index 4f4a39d9..dacce7c1 100644 --- a/src/ewins.c +++ b/src/ewins.c @@ -65,6 +65,7 @@ static void EwinHandleEventsToplevel(Win win, XEvent * ev, void *prm); static void EwinHandleEventsContainer(Win win, XEvent * ev, void *prm); static void EwinHandleEventsClient(Win win, XEvent * ev, void *prm); +static void EwinUnmap1(EWin * ewin); static void EwinUnmap2(EWin * ewin); Window @@ -385,6 +386,8 @@ EwinDestroy(EWin * ewin) if (!ewin) return; + EwinUnmap1(ewin); + if (ewin->state.state == EWIN_STATE_MAPPED) EwinUnmap2(ewin); diff --git a/src/moveresize.c b/src/moveresize.c index 048c53b6..41700fc5 100644 --- a/src/moveresize.c +++ b/src/moveresize.c @@ -213,6 +213,7 @@ _MoveResizeMoveEnd(EWin * ewin) Mode.mode = MODE_NONE; Mode.move.swap = 0; Mode.place.doing_manual = 0; + Mode_mr.ewin = NULL; if (Mode_mr.grab_server) { @@ -490,6 +491,7 @@ _MoveResizeResizeEnd(EWin * ewin) ESync(ESYNC_MOVRES); done: + Mode_mr.ewin = NULL; if (Mode_mr.grab_server) { EUngrabServer(); @@ -929,6 +931,8 @@ MoveResizeEnd(EWin * ewin) static void _MoveResizeEventHandler(Win win __UNUSED__, XEvent * ev, void *prm __UNUSED__) { + EWin *ewin; + #if 0 Eprintf("%s: type=%2d win=%#lx\n", __func__, ev->type, ev->xany.window); #endif @@ -944,9 +948,11 @@ _MoveResizeEventHandler(Win win __UNUSED__, XEvent * ev, void *prm __UNUSED__) break; #endif case ButtonRelease: - MoveResizeEnd(NULL); - if (Mode_mr.ewin) - BorderCheckState(Mode_mr.ewin, ev); + ewin = Mode_mr.ewin; + if (!ewin) + break; + MoveResizeEnd(ewin); + BorderCheckState(ewin, ev); break; case MotionNotify: _MoveResizeHandleMotion();