From 5d2b941bafd72b33dc94b4cfd7905783c3085717 Mon Sep 17 00:00:00 2001 Message-Id: <5d2b941bafd72b33dc94b4cfd7905783c3085717.1714458380.git.mdw@distorted.org.uk> From: Mark Wooding Date: Wed, 25 Nov 2009 11:24:14 +0000 Subject: [PATCH] more memory hygeine Organization: Straylight/Edgeware From: Richard Kettlewell --- clients/disorder.c | 14 ++++++++------ lib/client.c | 4 +++- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/clients/disorder.c b/clients/disorder.c index 02f6582..dac6c25 100644 --- a/clients/disorder.c +++ b/clients/disorder.c @@ -227,16 +227,17 @@ static void cf_somelist(char **argv, int (*fn)(disorder_client *c, const char *arg, const char *re, char ***vecp, int *nvecp)) { - char **vec; + char **vec, **base; const char *re; if(argv[1]) re = xstrdup(argv[1] + 1); else re = 0; - if(fn(getclient(), argv[0], re, &vec, 0)) exit(EXIT_FAILURE); - while(*vec) - xprintf("%s\n", nullcheck(utf82mb(*vec++))); + if(fn(getclient(), argv[0], re, &base, 0)) exit(EXIT_FAILURE); + for(vec = base; *vec; ++vec) + xprintf("%s\n", nullcheck(utf82mb_f(*vec))); + xfree(base); } static int isarg_regexp(const char *s) { @@ -894,7 +895,7 @@ int main(int argc, char **argv) { vector_init(&args); /* Include the command name in the args, but at element -1, for * the benefit of subcommand getopt calls */ - vector_append(&args, argv[n]); + vector_append(&args, xstrdup(argv[n])); n++; for(j = 0; j < commands[i].min; ++j) vector_append(&args, nullcheck(mb2utf8(argv[n + j]))); @@ -904,12 +905,13 @@ int main(int argc, char **argv) { vector_append(&args, nullcheck(mb2utf8(argv[n + j]))); vector_terminate(&args); commands[i].fn(args.vec + 1); - xfree(args.vec); + vector_clear(&args); n += j; } if(client && disorder_close(client)) exit(EXIT_FAILURE); if(fclose(stdout) < 0) disorder_fatal(errno, "error closing stdout"); config_free(config); + xfree(client); return status; } diff --git a/lib/client.c b/lib/client.c index d9023a9..c621ead 100644 --- a/lib/client.c +++ b/lib/client.c @@ -712,9 +712,11 @@ static int readlist(disorder_client *c, char ***vecp, int *nvecp) { if(nvecp) *nvecp = v.nvec; *vecp = v.vec; + xfree(l); return 0; } - vector_append(&v, l + (*l == '.')); + vector_append(&v, xstrdup(l + (*l == '.'))); + xfree(l); } if(ferror(c->fpin)) { byte_xasprintf((char **)&c->last, "input error: %s", strerror(errno)); -- [mdw]