summaryrefslogtreecommitdiff
path: root/sys/src/9/port/devsegment.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2015-06-09 03:33:37 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2015-06-09 03:33:37 +0200
commitcda46731d8166e5b113a8acdf90479a03bb6a3a8 (patch)
treec004dd0d1d0f4d672f018600f53970d45992182b /sys/src/9/port/devsegment.c
parente2a5d674d9d22492220200824a9ec28f95a02253 (diff)
devsegment: fix parsecmd() memory leak
Diffstat (limited to 'sys/src/9/port/devsegment.c')
-rw-r--r--sys/src/9/port/devsegment.c6
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);