aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Marriott <nicholas.marriott@gmail.com>2013-08-01 23:40:44 +0100
committerNicholas Marriott <nicholas.marriott@gmail.com>2013-08-01 23:40:44 +0100
commit939f796f086cac17ad0558b36fa87c55a9cb1a22 (patch)
tree9bd6dc9f9c821a44e3a4d44739019c3f888aed6e
parent27364345bf68785af58131c47ef46ff081622537 (diff)
downloadrtmux-939f796f086cac17ad0558b36fa87c55a9cb1a22.tar.gz
rtmux-939f796f086cac17ad0558b36fa87c55a9cb1a22.tar.bz2
rtmux-939f796f086cac17ad0558b36fa87c55a9cb1a22.zip
Don't leak formats if they are added multiple times.
-rw-r--r--format.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/format.c b/format.c
index 16ac53d6..2275090e 100644
--- a/format.c
+++ b/format.c
@@ -151,6 +151,7 @@ void
format_add(struct format_tree *ft, const char *key, const char *fmt, ...)
{
struct format_entry *fe;
+ struct format_entry *fe_now;
va_list ap;
fe = xmalloc(sizeof *fe);
@@ -160,7 +161,13 @@ format_add(struct format_tree *ft, const char *key, const char *fmt, ...)
xvasprintf(&fe->value, fmt, ap);
va_end(ap);
- RB_INSERT(format_tree, ft, fe);
+ fe_now = RB_INSERT(format_tree, ft, fe);
+ if (fe_now != NULL) {
+ free(fe_now->value);
+ fe_now->value = fe->value;
+ free(fe->key);
+ free(fe);
+ }
}
/* Find a format entry. */