shithub: front

Download patch

ref: 06d10d96e9a81e63be23889be6e5d428e786df56
parent: 9ad3c2d098700a84e0d7b3fd7f0939fe4c1de7f8
author: Ori Bernstein <ori@eigenstate.org>
date: Mon Nov 18 18:00:21 EST 2024

gefs: fix block leak when merging tree nodes

--- a/sys/src/cmd/gefs/tree.c
+++ b/sys/src/cmd/gefs/tree.c
@@ -326,7 +326,7 @@
 	 * delete messages, so we need to check if
 	 * there's anything in it to copy up.
 	 */
-	if(pp->nl->nval > 0){
+	if(pp->nl != nil){
 		getval(pp->nl, 0, &kv);
 		if(pp->nl->nbuf > 0){
 			getmsg(pp->nl, 0, &m);
@@ -337,7 +337,7 @@
 		if(nbytes != nil)
 			*nbytes += valsz(&kv);
 	}
-	if(pp->nr != nil && pp->nr->nval > 0){
+	if(pp->nr != nil){
 		getval(pp->nr, 0, &kv);
 		if(pp->nr->nbuf > 0){
 			getmsg(pp->nr, 0, &m);
@@ -436,6 +436,19 @@
 	return 0;
 }
 
+static Blk*
+setb(Tree *t, Blk *b)
+{
+	if(b->nval == 0){
+		freeblk(t, b);
+		return nil;
+	}else{
+		enqueue(b);
+		return b;
+	}
+}
+		
+
 static int
 pullmsg(Path *p, int i, Kvp *v, Msg *m, int *full, int spc)
 {
@@ -554,7 +567,8 @@
 		}
 	}
 	p->npull = (j - up->lo);
-	p->nl = n;
+	p->op = POmod;
+	p->nl = setb(t, n);
 }
 
 /*
@@ -626,7 +640,8 @@
 		j++;
 	}
 	p->npull = (j - up->lo);
-	p->nl = n;
+	p->op = POmod;
+	p->nl = setb(t, n);
 }
 
 /*
@@ -739,8 +754,8 @@
 	}
 	p->npull = (j - up->lo);
 	p->op = POsplit;
-	p->nl = l;
-	p->nr = r;
+	p->nl = setb(t, l);
+	p->nr = setb(t, r);
 	poperror();
 }
 
@@ -809,8 +824,8 @@
 		setmsg(d, &m);
 	}
 	p->op = POsplit;
-	p->nl = l;
-	p->nr = r;
+	p->nl = setb(t, l);
+	p->nr = setb(t, r);
 	poperror();
 }
 
@@ -840,11 +855,9 @@
 			setmsg(d, &m);
 		}
 	}
-	enqueue(d);
 	p->midx = idx;
-	pp->nl = d;
 	pp->op = POmerge;
-	pp->nr = nil;
+	pp->nl = setb(t, d);
 }
 
 /*
@@ -951,12 +964,10 @@
 			o++;
 		}
 	}
-	enqueue(l);
-	enqueue(r);
 	p->midx = midx;
 	pp->op = POrot;
-	pp->nl = l;
-	pp->nr = r;
+	pp->nl = setb(t, l);
+	pp->nr = setb(t, r);
 	poperror();
 }
 
@@ -1055,12 +1066,9 @@
 	if(p->b->type == Tleaf){
 		if(!filledleaf(p->b, up->sz)){
 			updateleaf(t, p-1, p);
-			enqueue(p->nl);
 			rp = p;
 		}else{
 			splitleaf(t, up, p, &mid);
-			enqueue(p->nl);
-			enqueue(p->nr);
 		}
 		p->midx = -1;
 		pp = p;
@@ -1076,12 +1084,9 @@
 				goto Out;
 			}
 			updatepiv(t, up, p, pp);
-			enqueue(p->nl);
 			rp = p;
 		}else{
 			splitpiv(t, up, p, pp, &mid);
-			enqueue(p->nl);
-			enqueue(p->nr);
 		}
 		pp = p;
 		up--;
--