devshr: fixed memory leaks / race condition

This commit is contained in:
aiju 2011-07-25 10:10:11 +02:00
parent e1260aa4d6
commit d2a1d1fb37

View file

@ -29,8 +29,12 @@ static void
shrdecref(Shr *sp) shrdecref(Shr *sp)
{ {
Mount *m, *mm; Mount *m, *mm;
int n;
if(decref(sp) != 0) qlock(&shrlk);
n = decref(sp);
qunlock(&shrlk);
if(n != 0)
return; return;
for(m = sp->umh.mount; m != nil; m = mm) { for(m = sp->umh.mount; m != nil; m = mm) {
@ -38,6 +42,8 @@ shrdecref(Shr *sp)
mm = m->next; mm = m->next;
free(m); free(m);
} }
if(sp->desc != nil)
free(sp->desc);
free(sp->owner); free(sp->owner);
free(sp->name); free(sp->name);
free(sp); free(sp);
@ -491,6 +497,7 @@ shrread(Chan *c, void *va, long n, vlong off)
} }
ret = readstr(off, va, n, sp->desc); ret = readstr(off, va, n, sp->desc);
qunlock(&sp->desclock); qunlock(&sp->desclock);
shrdecref(sp);
return ret; return ret;
} }
@ -511,19 +518,14 @@ shrwrite(Chan *c, void *va, long n, vlong)
qlock(&shrlk); qlock(&shrlk);
sp = shrlookup(nil, c->qid.path); sp = shrlookup(nil, c->qid.path);
if(sp == nil) { if(sp != nil)
qunlock(&shrlk); incref(sp);
error(Enonexist);
}
incref(sp);
qunlock(&shrlk); qunlock(&shrlk);
if(waserror()){ if(sp == nil)
shrdecref(sp); error(Enonexist);
nexterror();
}
buf = smalloc(n+1); buf = smalloc(n+1);
if(waserror()){ if(waserror()){
shrdecref(sp);
free(buf); free(buf);
nexterror(); nexterror();
} }
@ -542,7 +544,6 @@ shrwrite(Chan *c, void *va, long n, vlong)
shrdecref(sp); shrdecref(sp);
free(buf); free(buf);
poperror(); poperror();
poperror();
return n; return n;
} }
@ -616,7 +617,6 @@ shrwrite(Chan *c, void *va, long n, vlong)
shrdecref(sp); shrdecref(sp);
free(buf); free(buf);
poperror(); poperror();
poperror();
return n; return n;
} }