Many 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.

The 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.

This patch adds safeguards to prevent the ty and my positions from exceeding 
that of the window height.
---
 dwm.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/dwm.c b/dwm.c
index fb1e326..9fd0286 100644
--- a/dwm.c
+++ b/dwm.c
@@ -1689,11 +1689,13 @@ tile(Monitor *m)
                if (i < m->nmaster) {
                        h = (m->wh - my) / (MIN(n, m->nmaster) - i);
                        resize(c, m->wx, m->wy + my, mw - (2*c->bw), h - 
(2*c->bw), 0);
-                       my += HEIGHT(c);
+                       if (my + HEIGHT(c) < m->wh)
+                               my += HEIGHT(c);
                } else {
                        h = (m->wh - ty) / (n - i);
                        resize(c, m->wx + mw, m->wy + ty, m->ww - mw - 
(2*c->bw), h - (2*c->bw), 0);
-                       ty += HEIGHT(c);
+                       if (ty + HEIGHT(c) < m->wh)
+                               ty += HEIGHT(c);
                }
 }
 
-- 
2.17.1


Reply via email to