From 43d3c87294b34d1a79d3789518eee75f2ead246b Mon Sep 17 00:00:00 2001 From: cinap_lenrek Date: Tue, 27 Aug 2013 23:57:17 +0200 Subject: devproc: properly handle exclusive refcount for /proc/trace --- sys/src/9/port/devproc.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/sys/src/9/port/devproc.c b/sys/src/9/port/devproc.c index 4b47b3035..663a0205d 100644 --- a/sys/src/9/port/devproc.c +++ b/sys/src/9/port/devproc.c @@ -351,12 +351,12 @@ procopen(Chan *c, int omode) 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 @@ procfds(Proc *p, char *va, int count, long offset) } 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 @@ procclose(Chan * c) 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 -- cgit v1.2.3