ref: 43d3c87294b34d1a79d3789518eee75f2ead246b
parent: 84109a3159249369d1869fd887a7040b766e4540
author: cinap_lenrek <[email protected]>
date: Tue Aug 27 19:57:17 EDT 2013
devproc: properly handle exclusive refcount for /proc/trace
--- a/sys/src/9/port/devproc.c
+++ b/sys/src/9/port/devproc.c
@@ -351,12 +351,12 @@
error(Eperm);
lock(&tlock);
if (waserror()){
+ topens--;
unlock(&tlock);
nexterror();
}
- if (topens > 0)
+ if (topens++ > 0)
error("already open");
- topens++;
if (tevents == nil){
tevents = (Traceevent*)malloc(sizeof(Traceevent) * Nevents);
if(tevents == nil)
@@ -613,9 +613,9 @@
}
static void
-procclose(Chan * c)
+procclose(Chan *c)
{
- if(QID(c->qid) == Qtrace){
+ if(QID(c->qid) == Qtrace && (c->flag & COPEN) != 0){
lock(&tlock);
if(topens > 0)
topens--;
@@ -623,8 +623,10 @@
proctrace = nil;
unlock(&tlock);
}
- if(QID(c->qid) == Qns && c->aux != 0)
+ if(QID(c->qid) == Qns && c->aux != 0){
free(c->aux);
+ c->aux = 0;
+ }
}
static void