devshr: fixed memory leaks / race condition
This commit is contained in:
parent
e1260aa4d6
commit
d2a1d1fb37
1 changed files with 13 additions and 13 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue