diff options
author | Richard Grenville <[email protected]> | 2012-09-12 12:14:24 +0800 |
---|---|---|
committer | Richard Grenville <[email protected]> | 2012-09-12 12:14:24 +0800 |
commit | 17b8a50161ab84a7b1d05d69b14a81d9a98e4432 (patch) | |
tree | def8e6b45d1e8430911b6cbca8a847d7191c3860 | |
parent | 05b229f2a0405f5eec0af1ba55a71923ed192d55 (diff) | |
download | tdebase-17b8a50161ab84a7b1d05d69b14a81d9a98e4432.tar.gz tdebase-17b8a50161ab84a7b1d05d69b14a81d9a98e4432.zip |
Bug fix: Double free when XQueryTree() fails
Take care of failure of XQueryTree() to prevent it from causing a
double-free crash. This usually happens when X is initializing and windows
are constantly changing.
-rw-r--r-- | compton.c | 30 |
1 files changed, 24 insertions, 6 deletions
@@ -1022,7 +1022,7 @@ paint_all(Display *dpy, XserverRegion region) { } #ifdef DEBUG_REPAINT - printf(" 0x%x", w->id); + printf(" %#010lx", w->id); #endif if (clip_changed) { @@ -1418,8 +1418,17 @@ map_win(Display *dpy, Window id, Window *tchildren; unsigned tnchildren; - XQueryTree(dpy, wid, &troot, &parent, &tchildren, &tnchildren); - XFree(tchildren); + // XQueryTree probably fails if you run compton when X is somehow + // initializing (like add it in .xinitrc). In this case + // just leave it alone. + if(!XQueryTree(dpy, wid, &troot, &parent, &tchildren, + &tnchildren)) { + wid = 0; + break; + } + + if (tchildren) + XFree(tchildren); wid = parent; } @@ -2934,11 +2943,20 @@ main(int argc, char **argv) { && !array_wid_exists(children, nchildren, wid)) { Window troot; Window parent; - Window *tchildren; + Window *tchildren = 0; unsigned tnchildren; - XQueryTree(dpy, wid, &troot, &parent, &tchildren, &tnchildren); - XFree(tchildren); + // XQueryTree probably fails if you run compton when X is somehow + // initializing (like add it in .xinitrc). In this case + // just leave it alone. + if(!XQueryTree(dpy, wid, &troot, &parent, &tchildren, + &tnchildren)) { + wid = 0; + break; + } + + if (tchildren) + XFree(tchildren); wid = parent; } |