From d2a1d1fb37eb8df28a3a07263519580c1c8450bf Mon Sep 17 00:00:00 2001 From: aiju Date: Mon, 25 Jul 2011 10:10:11 +0200 Subject: [PATCH] devshr: fixed memory leaks / race condition --- sys/src/9/port/devshr.c | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/sys/src/9/port/devshr.c b/sys/src/9/port/devshr.c index bd10e2b90..e6e4f4399 100644 --- a/sys/src/9/port/devshr.c +++ b/sys/src/9/port/devshr.c @@ -29,8 +29,12 @@ static void shrdecref(Shr *sp) { Mount *m, *mm; + int n; - if(decref(sp) != 0) + qlock(&shrlk); + n = decref(sp); + qunlock(&shrlk); + if(n != 0) return; for(m = sp->umh.mount; m != nil; m = mm) { @@ -38,6 +42,8 @@ shrdecref(Shr *sp) mm = m->next; free(m); } + if(sp->desc != nil) + free(sp->desc); free(sp->owner); free(sp->name); free(sp); @@ -491,6 +497,7 @@ shrread(Chan *c, void *va, long n, vlong off) } ret = readstr(off, va, n, sp->desc); qunlock(&sp->desclock); + shrdecref(sp); return ret; } @@ -511,19 +518,14 @@ shrwrite(Chan *c, void *va, long n, vlong) qlock(&shrlk); sp = shrlookup(nil, c->qid.path); - if(sp == nil) { - qunlock(&shrlk); - error(Enonexist); - } - incref(sp); + if(sp != nil) + incref(sp); qunlock(&shrlk); - if(waserror()){ - shrdecref(sp); - nexterror(); - } - + if(sp == nil) + error(Enonexist); buf = smalloc(n+1); if(waserror()){ + shrdecref(sp); free(buf); nexterror(); } @@ -542,7 +544,6 @@ shrwrite(Chan *c, void *va, long n, vlong) shrdecref(sp); free(buf); poperror(); - poperror(); return n; } @@ -616,7 +617,6 @@ shrwrite(Chan *c, void *va, long n, vlong) shrdecref(sp); free(buf); poperror(); - poperror(); return n; }