From 813b2c1edc90d51c2b98385c74dffec56e18da84 Mon Sep 17 00:00:00 2001 From: Polesznyák Márk Date: Sun, 22 Feb 2026 14:35:09 +0100 Subject: chore(dwm): sync with upstream Commits: - cleanup schemes and colors (93f2686) - drw.c: drw_scm_free: call free inside (7c3abae) - dwm: Fix heap buffer overflow in getatomprop (244fa85) - dwm: Fix getatomprop regression from heap overflow fix (a9aa0d8) - fix not updating _NET_ACTIVE_WINDOW (397d618) - getstate: fix access type and remove redundant cast (5c9f303) - more overflow fix in getatomprop() (c3dd6a8) --- dwm/config.mk | 2 +- dwm/drw.c | 29 ++++++++++++++++++++++++++--- dwm/drw.h | 2 ++ dwm/dwm.c | 25 ++++++++++++------------- 4 files changed, 41 insertions(+), 17 deletions(-) diff --git a/dwm/config.mk b/dwm/config.mk index 6560a6d..ea57921 100644 --- a/dwm/config.mk +++ b/dwm/config.mk @@ -1,5 +1,5 @@ # dwm version -VERSION = 6.6 +VERSION = 6.8 # Customize below to fit your system diff --git a/dwm/drw.c b/dwm/drw.c index 2814114..a1f7661 100644 --- a/dwm/drw.c +++ b/dwm/drw.c @@ -181,8 +181,7 @@ drw_clr_create(Drw *drw, Clr *dest,const char *clrname, unsigned int alpha) dest->pixel = (dest->pixel & 0x00FFFFFFU) | (alpha << 24); } -/* Wrapper to create color schemes. The caller has to call free(3) on the - * returned color scheme when done using it. */ +/* Create color schemes. */ Clr * drw_scm_create(Drw *drw, const char *clrnames[], const unsigned int alphas[], size_t clrcount) { @@ -190,7 +189,7 @@ drw_scm_create(Drw *drw, const char *clrnames[], const unsigned int alphas[], si Clr *ret; /* need at least two colors for a scheme */ - if (!drw || !clrnames || clrcount < 2 || !(ret = ecalloc(clrcount, sizeof(XftColor)))) + if (!drw || !clrnames || clrcount < 2 || !(ret = ecalloc(clrcount, sizeof(Clr)))) return NULL; for (i = 0; i < clrcount; i++) @@ -198,6 +197,30 @@ drw_scm_create(Drw *drw, const char *clrnames[], const unsigned int alphas[], si return ret; } +void +drw_clr_free(Drw *drw, Clr *c) +{ + if (!drw || !c) + return; + + /* c is typedef XftColor Clr */ + XftColorFree(drw->dpy, DefaultVisual(drw->dpy, drw->screen), + DefaultColormap(drw->dpy, drw->screen), c); +} + +void +drw_scm_free(Drw *drw, Clr *scm, size_t clrcount) +{ + size_t i; + + if (!drw || !scm) + return; + + for (i = 0; i < clrcount; i++) + drw_clr_free(drw, &scm[i]); + free(scm); +} + void drw_setfontset(Drw *drw, Fnt *set) { diff --git a/dwm/drw.h b/dwm/drw.h index d28678f..c85a751 100644 --- a/dwm/drw.h +++ b/dwm/drw.h @@ -43,7 +43,9 @@ void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned in /* Colorscheme abstraction */ void drw_clr_create(Drw *drw, Clr *dest, const char *clrname, unsigned int alpha); +void drw_clr_free(Drw *drw, Clr *c); Clr *drw_scm_create(Drw *drw, const char *clrnames[], const unsigned int alphas[], size_t clrcount); +void drw_scm_free(Drw *drw, Clr *scm, size_t clrcount); /* Cursor abstraction */ Cur *drw_cur_create(Drw *drw, int shape); diff --git a/dwm/dwm.c b/dwm/dwm.c index a10de14..60274dc 100644 --- a/dwm/dwm.c +++ b/dwm/dwm.c @@ -556,7 +556,7 @@ cleanup(void) for (i = 0; i < CurLast; i++) drw_cur_free(drw, cursor[i]); for (i = 0; i < LENGTH(colors); i++) - free(scheme[i]); + drw_scm_free(drw, scheme[i], 3); free(scheme); XDestroyWindow(dpy, wmcheckwin); drw_free(drw); @@ -949,14 +949,15 @@ focusstack(const Arg *arg) Atom getatomprop(Client *c, Atom prop) { - int di; - unsigned long dl; + int format; + unsigned long nitems, dl; unsigned char *p = NULL; Atom da, atom = None; if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, XA_ATOM, - &da, &di, &dl, &dl, &p) == Success && p) { - atom = *(Atom *)p; + &da, &format, &nitems, &dl, &p) == Success && p) { + if (nitems > 0 && format == 32) + atom = *(long *)p; XFree(p); } return atom; @@ -982,10 +983,10 @@ getstate(Window w) Atom real; if (XGetWindowProperty(dpy, w, wmatom[WMState], 0L, 2L, False, wmatom[WMState], - &real, &format, &n, &extra, (unsigned char **)&p) != Success) + &real, &format, &n, &extra, &p) != Success) return -1; - if (n != 0) - result = *p; + if (n != 0 && format == 32) + result = *(long *)p; XFree(p); return result; } @@ -1581,12 +1582,10 @@ sendevent(Client *c, Atom proto) void setfocus(Client *c) { - if (!c->neverfocus) { + if (!c->neverfocus) XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); - XChangeProperty(dpy, root, netatom[NetActiveWindow], - XA_WINDOW, 32, PropModeReplace, - (unsigned char *) &(c->win), 1); - } + XChangeProperty(dpy, root, netatom[NetActiveWindow], XA_WINDOW, 32, + PropModeReplace, (unsigned char *) &(c->win), 1); sendevent(c, wmatom[WMTakeFocus]); } -- cgit v1.2.3