The Arg union is generally passed to functions called from a Key or
Button. One of its members, "v", allows passing a `const void *` with
the receiving function determining the intent and casting as
appropriate.
There are a few places in the dwm code where we cast away the constness
of this pointer unnecessarily, potentially allowing its mutation. For
example, execvp's argv is a `char *const *`, but we just cast away the
outer const pointer.
The other case is in setlayout(), but that case is trivial: there's no
issue just casting the const void pointer to a `const Layout *`.
---
dwm.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/dwm.c b/dwm.c
index 253aba7..4c0f679 100644
--- a/dwm.c
+++ b/dwm.c
@@ -1504,7 +1504,7 @@ setlayout(const Arg *arg)
if (!arg || !arg->v || arg->v != selmon->lt[selmon->sellt])
selmon->sellt ^= 1;
if (arg && arg->v)
- selmon->lt[selmon->sellt] = (Layout *)arg->v;
+ selmon->lt[selmon->sellt] = (const Layout *)arg->v;
strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof
selmon->ltsymbol);
if (selmon->sel)
arrange(selmon);
@@ -1642,11 +1642,12 @@ spawn(const Arg *arg)
if (arg->v == dmenucmd)
dmenumon[0] = '0' + selmon->num;
if (fork() == 0) {
+ char *const *cmd = arg->v;
if (dpy)
close(ConnectionNumber(dpy));
setsid();
- execvp(((char **)arg->v)[0], (char **)arg->v);
- die("dwm: execvp '%s' failed:", ((char **)arg->v)[0]);
+ execvp(cmd[0], cmd);
+ die("dwm: execvp '%s' failed:", cmd[0]);
}
}
--
2.37.2