shithub: riscv

Download patch

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