ref: 4626f9b20df8a86229a58a196eacd645e10ca690
parent: e259f9d582ce2cb4ee427efe0f366504794b5095
author: B. Wilson <x@wilsonb.com>
date: Mon Jul 14 03:13:31 EDT 2025
Fix over-decref bug on client
--- a/ridefs.c
+++ b/ridefs.c
@@ -183,10 +183,12 @@
}
void
-rmclient(int i){
+freeclient(int i){
Client *c;
c = clientref(i);
+ if(c == nil || c->ref == 0)
+ return;
if(decref(c))
return;
@@ -303,7 +305,7 @@
n |= buf[2]<<8 & 0x0000ff00;
n |= buf[3] & 0x000000ff;
n -= 8; /* len + magic */
- pld = ecalloc(n+32); /* XXX: normalization overhead */
+ pld = ecalloc(n+1 + 32); /* normalization overhead */
if((n = readn(fd, pld, n)) < 0)
return n;
@@ -567,10 +569,7 @@
case Qevent: c->ev.open -= c->ev.open ? 1 : 0; break;
}
- if(c)
- rmclient(f->client);
-
-
+ freeclient(f->client);
free(f);
}
@@ -592,7 +591,7 @@
f = ecalloc(sizeof(*f));
f->kind = Qroot;
- f->client = -1;
+ f->client = -1; /* no client */
mkqid(&r->fid->qid, f->kind, f->client);
r->fid->aux = f;
@@ -789,7 +788,7 @@
case Qroot: break;
case Qclient:
f->kind = Qroot;
- if(f->client > -1) rmclient(f->client);
+ freeclient(f->client);
f->client = -1;
break;
}
--
⑨