idwm crashes when opening 50+ clients (tile layout) - dwm - dynamic window manager Err parazyd.org 70 hgit clone https://git.parazyd.org/dwm URL:https://git.parazyd.org/dwm parazyd.org 70 1Log /git/dwm/log.gph parazyd.org 70 1Files /git/dwm/files.gph parazyd.org 70 1Refs /git/dwm/refs.gph parazyd.org 70 1README /git/dwm/file/README.gph parazyd.org 70 1LICENSE /git/dwm/file/LICENSE.gph parazyd.org 70 i--- Err parazyd.org 70 1commit f09418bbb6651ab4c299cfefbe1d18de401f630e /git/dwm/commit/f09418bbb6651ab4c299cfefbe1d18de401f630e.gph parazyd.org 70 1parent ed3ab6b4fceded0e9f2d22372df49a2bbd58de66 /git/dwm/commit/ed3ab6b4fceded0e9f2d22372df49a2bbd58de66.gph parazyd.org 70 hAuthor: bakkeby URL:mailto:bakkeby@gmail.com parazyd.org 70 iDate: Thu, 23 Apr 2020 09:50:54 +0200 Err parazyd.org 70 i Err parazyd.org 70 idwm crashes when opening 50+ clients (tile layout) Err parazyd.org 70 i Err parazyd.org 70 iMany users new to dwm find themselves caught out by being kicked out to the login manager (dwm crashing) when they open 50+ clients for demonstration purposes. The number of clients reported varies depending on the resolution of the monitor. Err parazyd.org 70 i Err parazyd.org 70 iThe cause of this is due to how the default tile layout calculates the height of the next client based on the position of the previous client. Because clients have a minimum size the (ty) position can exceed that of the window height, resulting in (m->wh - ty) becoming negative. The negative height stored as an unsigned int results in a very large height ultimately resulting in dwm crashing. Err parazyd.org 70 i Err parazyd.org 70 iThis patch adds safeguards to prevent the ty and my positions from exceeding that of the window height. Err parazyd.org 70 i Err parazyd.org 70 iDiffstat: Err parazyd.org 70 i M dwm.c | 6 ++++-- Err parazyd.org 70 i Err parazyd.org 70 i1 file changed, 4 insertions(+), 2 deletions(-) Err parazyd.org 70 i--- Err parazyd.org 70 1diff --git a/dwm.c b/dwm.c /git/dwm/file/dwm.c.gph parazyd.org 70 i@@ -1689,11 +1689,13 @@ tile(Monitor *m) Err parazyd.org 70 i if (i < m->nmaster) { Err parazyd.org 70 i h = (m->wh - my) / (MIN(n, m->nmaster) - i); Err parazyd.org 70 i resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - (2*c->bw), 0); Err parazyd.org 70 i- my += HEIGHT(c); Err parazyd.org 70 i+ if (my + HEIGHT(c) < m->wh) Err parazyd.org 70 i+ my += HEIGHT(c); Err parazyd.org 70 i } else { Err parazyd.org 70 i h = (m->wh - ty) / (n - i); Err parazyd.org 70 i resize(c, m->wx + mw, m->wy + ty, m->ww - mw - (2*c->bw), h - (2*c->bw), 0); Err parazyd.org 70 i- ty += HEIGHT(c); Err parazyd.org 70 i+ if (ty + HEIGHT(c) < m->wh) Err parazyd.org 70 i+ ty += HEIGHT(c); Err parazyd.org 70 i } Err parazyd.org 70 i } Err parazyd.org 70 i Err parazyd.org 70 .