summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOkan Demirmen <okan@cvs.openbsd.org>2013-01-01 14:33:53 +0000
committerOkan Demirmen <okan@cvs.openbsd.org>2013-01-01 14:33:53 +0000
commitcf8a2c4c6ea32066a492adfa65efb3de8f7ca5f6 (patch)
tree8822dea9fd0b8989ccec104f9d82c010476e218f
parent0b80488019678c682d2ade68949f2134fdcf177c (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.h5
-rw-r--r--app/cwm/conf.c8
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);
}
}