diff options
author | Okan Demirmen <okan@cvs.openbsd.org> | 2013-01-01 14:33:53 +0000 |
---|---|---|
committer | Okan Demirmen <okan@cvs.openbsd.org> | 2013-01-01 14:33:53 +0000 |
commit | cf8a2c4c6ea32066a492adfa65efb3de8f7ca5f6 (patch) | |
tree | 8822dea9fd0b8989ccec104f9d82c010476e218f | |
parent | 0b80488019678c682d2ade68949f2134fdcf177c (diff) |
least intrusive way to plug a memleak when unbinding a duplicate key for
kbfunc_cmdexec; from Tiago Cunha
-rw-r--r-- | app/cwm/calmwm.h | 5 | ||||
-rw-r--r-- | app/cwm/conf.c | 8 |
2 files changed, 10 insertions, 3 deletions
diff --git a/app/cwm/calmwm.h b/app/cwm/calmwm.h index c5476d521..76f1fe2d9 100644 --- a/app/cwm/calmwm.h +++ b/app/cwm/calmwm.h @@ -15,7 +15,7 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * - * $OpenBSD: calmwm.h,v 1.180 2013/01/01 14:19:56 okan Exp $ + * $OpenBSD: calmwm.h,v 1.181 2013/01/01 14:33:52 okan Exp $ */ #ifndef _CALMWM_H_ @@ -74,6 +74,8 @@ #define CWM_MENU_DUMMY 0x0001 #define CWM_MENU_FILE 0x0002 +#define ARG_CHAR 0x0001 +#define ARG_INT 0x0002 union arg { char *c; int i; @@ -239,6 +241,7 @@ struct keybinding { int keycode; #define KBFLAG_NEEDCLIENT 0x0001 int flags; + int argtype; }; TAILQ_HEAD(keybinding_q, keybinding); diff --git a/app/cwm/conf.c b/app/cwm/conf.c index cdf9acb1a..2f9a05768 100644 --- a/app/cwm/conf.c +++ b/app/cwm/conf.c @@ -15,7 +15,7 @@ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * - * $OpenBSD: conf.c,v 1.116 2012/12/19 15:21:34 okan Exp $ + * $OpenBSD: conf.c,v 1.117 2013/01/01 14:33:52 okan Exp $ */ #include <sys/param.h> @@ -470,14 +470,16 @@ conf_bindname(struct conf *c, char *name, char *binding) current_binding->callback = name_to_kbfunc[i].handler; current_binding->flags = name_to_kbfunc[i].flags; current_binding->argument = name_to_kbfunc[i].argument; + current_binding->argtype |= ARG_INT; conf_grab(c, current_binding); TAILQ_INSERT_TAIL(&c->keybindingq, current_binding, entry); return; } current_binding->callback = kbfunc_cmdexec; - current_binding->argument.c = xstrdup(binding); current_binding->flags = 0; + current_binding->argument.c = xstrdup(binding); + current_binding->argtype |= ARG_CHAR; conf_grab(c, current_binding); TAILQ_INSERT_TAIL(&c->keybindingq, current_binding, entry); } @@ -496,6 +498,8 @@ conf_unbind(struct conf *c, struct keybinding *unbind) key->keysym == unbind->keysym) { conf_ungrab(c, key); TAILQ_REMOVE(&c->keybindingq, key, entry); + if (key->argtype & ARG_CHAR) + free(key->argument.c); free(key); } } |