diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-09-04 21:27:59 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-09-04 21:27:59 +0200 |
commit | cca9a1b52381fe2c839350226eceeb1cc987c27f (patch) | |
tree | 173e3d8053b1a98b36cf2a2849e45a4d2df41c94 /sys/src/cmd/abaco/util.c | |
parent | 32236b49573cbc081515883d4d371c4a160daeb9 (diff) |
abaco: fix memory leaks
Diffstat (limited to 'sys/src/cmd/abaco/util.c')
-rw-r--r-- | sys/src/cmd/abaco/util.c | 67 |
1 files changed, 28 insertions, 39 deletions
diff --git a/sys/src/cmd/abaco/util.c b/sys/src/cmd/abaco/util.c index bb69f1947..d6872ec15 100644 --- a/sys/src/cmd/abaco/util.c +++ b/sys/src/cmd/abaco/util.c @@ -443,10 +443,13 @@ initfontpaths(void) { Biobufhdr *bp; char buf[128]; + char *s; int i; /* we don't care if getenv(2) fails */ - snprint(buf, sizeof(buf)-1, "%s/lib/abaco.fonts", getenv("home")); + s = getenv("home"); + snprint(buf, sizeof(buf)-1, "%s/lib/abaco.fonts", s); + free(s); if((bp=Bopen(buf, OREAD)) == nil) goto Default; @@ -658,66 +661,52 @@ validurl(Rune *r) static void execproc(void *v) { - Channel *sync; Exec *e; - int p[2], q[2]; - char *cmd; threadsetname("execproc"); e = v; - p[0] = e->p[0]; - p[1] = e->p[1]; - q[0] = e->q[0]; - q[1] = e->q[1]; - cmd = e->cmd; - sync = e->sync; rfork(RFFDG); - free(e); - dup(p[0], 0); - close(p[0]); - close(p[1]); - if(q[0]){ - dup(q[1], 1); - close(q[0]); - close(q[1]); + dup(e->p[0], 0); + close(e->p[0]); + close(e->p[1]); + if(e->q[0]){ + dup(e->q[1], 1); + close(e->q[0]); + close(e->q[1]); } if(!procstderr) close(2); - procexecl(sync, "/bin/rc", "rc", "-c", cmd, 0); + procexecl(e->sync, "/bin/rc", "rc", "-c", e->cmd, 0); error("can't exec"); } int pipeline(int fd, char *cmd, ...) { - Channel *sync; Exec *e; - int p[2], q[2]; va_list a; - if(pipe(p)<0 || pipe(q)<0) - error("can't create pipe"); - close(p[0]); - p[0] = fd; - sync = chancreate(sizeof(ulong), 0); - if(sync == nil) - error("can't create channel"); e = emalloc(sizeof(Exec)); - e->p[0] = p[0]; - e->p[1] = p[1]; - e->q[0] = q[0]; - e->q[1] = q[1]; + if(pipe(e->p)<0 || pipe(e->q)<0) + error("can't create pipe"); + close(e->p[0]); + e->p[0] = fd; va_start(a, cmd); e->cmd = vsmprint(cmd, a); va_end(a); - e->sync = sync; + e->sync = chancreate(sizeof(ulong), 0); + if(e->sync == nil) + error("can't create channel"); proccreate(execproc, e, STACK); - recvul(sync); - chanfree(sync); - close(p[0]); - close(p[1]); - close(q[1]); - return q[0]; + recvul(e->sync); + chanfree(e->sync); + free(e->cmd); + close(e->p[0]); + close(e->p[1]); + close(e->q[1]); + fd = e->q[0]; + free(e); + return fd; } static |