shithub: ridefs

Download patch

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;
 		}
--