diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2015-06-09 03:33:37 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2015-06-09 03:33:37 +0200 |
commit | cda46731d8166e5b113a8acdf90479a03bb6a3a8 (patch) | |
tree | c004dd0d1d0f4d672f018600f53970d45992182b /sys/src/9/port/devsegment.c | |
parent | e2a5d674d9d22492220200824a9ec28f95a02253 (diff) |
devsegment: fix parsecmd() memory leak
Diffstat (limited to 'sys/src/9/port/devsegment.c')
-rw-r--r-- | sys/src/9/port/devsegment.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/sys/src/9/port/devsegment.c b/sys/src/9/port/devsegment.c index 07b0fca9c..384d54aa6 100644 --- a/sys/src/9/port/devsegment.c +++ b/sys/src/9/port/devsegment.c @@ -315,6 +315,10 @@ segmentwrite(Chan *c, void *a, long n, vlong voff) switch(TYPE(c)){ case Qctl: cb = parsecmd(a, n); + if(waserror()){ + free(cb); + nexterror(); + } if(strcmp(cb->f[0], "va") == 0){ if(g->s != nil) error("already has a virtual address"); @@ -335,6 +339,8 @@ segmentwrite(Chan *c, void *a, long n, vlong voff) g->s = newseg(SG_SHARED, va, len); } else error(Ebadctl); + free(cb); + poperror(); break; case Qdata: return segio(g, g->s, a, n, voff, 0); |