# HG changeset patch # User Erik Quanstrom # Date 1331074039 -3600 # Node ID c3263590c9534a1de11dac60ffc5bb296b24966c # Parent 784debe5594b0183cfe66a377a64b7ef7c932d64 plumber: fix memory leaks and arm arch crashes there are a few sloppy bits in the plumber. upas tends to find these, and plumber didn't have enough stack for arm. the biggest change was to get rid of the ill-advised static buffer in libplumb, which is not thread safe. adding a mutex caused some deadlocks, iirc with upas/fs. this was the message attached to the patch in plan 9 (maybe/maybe/plumbmem) fix crash due to timing bug in libplumb as here http://9fans.net/archive/2009/04/103 http://9fans.net/archive/2009/04/121 http://9fans.net/archive/2009/04/124 http://9fans.net/archive/2009/04/126 also fix a few trivial memory leaks in plumber. R=nixiedev, nemo CC=nix-dev http://codereview.appspot.com/5756060 Committer: Francisco J Ballesteros diff -r 784debe5594b -r c3263590c953 sys/src/cmd/plumb/fsys.c --- a/sys/src/cmd/plumb/fsys.c Tue Mar 06 23:46:39 2012 +0100 +++ b/sys/src/cmd/plumb/fsys.c Tue Mar 06 23:47:19 2012 +0100 @@ -10,7 +10,7 @@ enum { - Stack = 8*1024 + Stack = 16*1024 }; typedef struct Dirtab Dirtab; diff -r 784debe5594b -r c3263590c953 sys/src/cmd/plumb/plumber.c --- a/sys/src/cmd/plumb/plumber.c Tue Mar 06 23:46:39 2012 +0100 +++ b/sys/src/cmd/plumb/plumber.c Tue Mar 06 23:47:19 2012 +0100 @@ -143,5 +143,6 @@ t = strdup(s); if(t == nil) error("estrdup failed: %r"); + setmalloctag(t, getcallerpc(&s)); return t; } diff -r 784debe5594b -r c3263590c953 sys/src/cmd/plumb/rules.c --- a/sys/src/cmd/plumb/rules.c Tue Mar 06 23:46:39 2012 +0100 +++ b/sys/src/cmd/plumb/rules.c Tue Mar 06 23:47:19 2012 +0100 @@ -123,6 +123,7 @@ Bterm(in->fd); free(in->fd); } + free(in->file); free(in); return 1; } @@ -330,6 +331,9 @@ if(ends) *ends = s; *p = '\0'; + /* disabled due to default plumbing having broken rule */ + if(0 && quoting) + return "eof-in-quoted-string"; return ebuf; } @@ -572,6 +576,8 @@ parseerror("too many ports"); if(lookup(r->qarg, badports) >= 0) parseerror("illegal port name %s", r->qarg); + if(rs->port) + free(rs->port); rs->port = estrdup(r->qarg); }else ncmd++; /* start or client rule */ diff -r 784debe5594b -r c3263590c953 sys/src/libplumb/mesg.c --- a/sys/src/libplumb/mesg.c Tue Mar 06 23:46:39 2012 +0100 +++ b/sys/src/libplumb/mesg.c Tue Mar 06 23:47:19 2012 +0100 @@ -2,8 +2,6 @@ #include #include "plumb.h" -static char attrbuf[4096]; - int plumbopen(char *name, int omode) { @@ -70,20 +68,20 @@ /* quote attribute value, if necessary */ static char* -quote(char *s) +quote(char *s, char *buf, char *bufe) { char *t; int c; if(s == nil){ - attrbuf[0] = '\0'; - return attrbuf; + buf[0] = '\0'; + return buf; } if(strpbrk(s, " '=\t") == nil) return s; - t = attrbuf; + t = buf; *t++ = '\''; - while(t < attrbuf+sizeof attrbuf-2){ + while(t < bufe-2){ c = *s++; if(c == '\0') break; @@ -93,7 +91,7 @@ } *t++ = '\''; *t = '\0'; - return attrbuf; + return buf; } char* @@ -101,13 +99,16 @@ { int n; Plumbattr *a; - char *s, *t; + char *s, *t, *buf, *bufe; if(attr == nil) return nil; + if((buf = malloc(4096)) == nil) + return nil; + bufe = buf + 4096; n = 0; for(a=attr; a!=nil; a=a->next) - n += Strlen(a->name) + 1 + Strlen(quote(a->value)) + 1; + n += Strlen(a->name) + 1 + Strlen(quote(a->value, buf, bufe)) + 1; s = malloc(n); if(s == nil) return nil; @@ -118,11 +119,12 @@ *t++ = ' '; strcpy(t, a->name); strcat(t, "="); - strcat(t, quote(a->value)); + strcat(t, quote(a->value, buf, bufe)); t += strlen(t); } if(t > s+n) abort(); + free(buf); return s; } @@ -236,9 +238,13 @@ plumbunpackattr(char *p) { Plumbattr *attr, *prev, *a; - char *q, *v; + char *q, *v, *buf, *bufe; int c, quoting; + buf = malloc(4096); + if(buf == nil) + return nil; + bufe = buf + 4096; attr = prev = nil; while(*p!='\0' && *p!='\n'){ while(*p==' ' || *p=='\t') @@ -262,10 +268,10 @@ a->name[q-p] = '\0'; /* process quotes in value */ q++; /* skip '=' */ - v = attrbuf; + v = buf; quoting = 0; while(*q!='\0' && *q!='\n'){ - if(v >= attrbuf+sizeof attrbuf) + if(v >= bufe) break; c = *q++; if(quoting){ @@ -287,14 +293,14 @@ } *v++ = c; } - a->value = malloc(v-attrbuf+1); + a->value = malloc(v-buf+1); if(a->value == nil){ free(a->name); free(a); break; } - memmove(a->value, attrbuf, v-attrbuf); - a->value[v-attrbuf] = '\0'; + memmove(a->value, buf, v-buf); + a->value[v-buf] = '\0'; a->next = nil; if(prev == nil) attr = a; @@ -303,6 +309,7 @@ prev = a; p = q; } + free(buf); return attr; }