diff options
author | Nicholas Marriott <nicholas.marriott@gmail.com> | 2009-02-16 18:43:07 +0000 |
---|---|---|
committer | Nicholas Marriott <nicholas.marriott@gmail.com> | 2009-02-16 18:43:07 +0000 |
commit | a766f9743aa2bd9ed7caf5a97ea64f4bc2758ba1 (patch) | |
tree | 450ecae1efabd05941245ef3049598088b52bf33 /tty-keys.c | |
parent | 17017ef3bcb433355fbfbdf479edfa9b7c4d13b1 (diff) | |
download | rtmux-a766f9743aa2bd9ed7caf5a97ea64f4bc2758ba1.tar.gz rtmux-a766f9743aa2bd9ed7caf5a97ea64f4bc2758ba1.tar.bz2 rtmux-a766f9743aa2bd9ed7caf5a97ea64f4bc2758ba1.zip |
Don't leak existing keys.
Diffstat (limited to 'tty-keys.c')
-rw-r--r-- | tty-keys.c | 19 |
1 files changed, 13 insertions, 6 deletions
@@ -1,4 +1,4 @@ -/* $Id: tty-keys.c,v 1.21 2009-01-28 19:52:21 nicm Exp $ */ +/* $Id: tty-keys.c,v 1.22 2009-02-16 18:43:07 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net> @@ -123,7 +123,14 @@ tty_keys_cmp(struct tty_key *k1, struct tty_key *k2) void tty_keys_add(struct tty *tty, const char *s, int key, int flags) { - struct tty_key *tk; + struct tty_key *tk, tl; + + tl.string = s; + if ((tk = RB_FIND(tty_keys, &tty->ktree, &tl)) != NULL) { + log_debug("already key matching: %s (old %x, new %x)", + tk->string, tk->key, key); + return; + } tk = xmalloc(sizeof *tk); tk->string = xstrdup(s); @@ -174,10 +181,10 @@ tty_keys_init(struct tty *tty) void tty_keys_free(struct tty *tty) { - struct tty_key *tk, *tl; - - for (tk = RB_MIN(tty_keys, &tty->ktree); tk != NULL; tk = tl) { - tl = RB_NEXT(tty_keys, &tty->ktree, tk); + struct tty_key *tk; + + while (!RB_EMPTY(&tty->ktree)) { + tk = RB_ROOT(&tty->ktree); RB_REMOVE(tty_keys, &tty->ktree, tk); xfree(tk->string); xfree(tk); |