chiark / gitweb /
more memory hygeine
authorRichard Kettlewell <rjk@greenend.org.uk>
Wed, 25 Nov 2009 11:24:14 +0000 (11:24 +0000)
committerRichard Kettlewell <rjk@greenend.org.uk>
Wed, 25 Nov 2009 11:24:14 +0000 (11:24 +0000)
clients/disorder.c
lib/client.c

index 02f6582dde189d4afd924376840feba532f96fa1..dac6c25e6d2452049603509a453d339f050a624e 100644 (file)
@@ -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;
 }
 
index d9023a985bd3074d1da1d571ca5f0969a19a821f..c621ead5612364b3be836c8807df10816bc343fe 100644 (file)
@@ -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));