git: 9front

Download patch

ref: 9673e8a83a255a36f4bba22bd7fff70978680c21
parent: 05fd442244ae5597ba3d9fe9fd9ae9a618ffd4a5
author: cinap_lenrek <cinap_lenrek@gmx.de>
date: Fri Feb 15 17:56:54 EST 2013

etheriwl: avoid leaking blocks when controller breaks

--- a/sys/src/9/pc/etheriwl.c
+++ b/sys/src/9/pc/etheriwl.c
@@ -1263,8 +1263,10 @@
 				if((b = ctlr->calib.cmd[i]) == nil)
 					continue;
 				b->ref++;	/* dont free on command completion */
-				if((err = qcmd(ctlr, 4, 176, nil, 0, b)) != nil)
+				if((err = qcmd(ctlr, 4, 176, nil, 0, b)) != nil){
+					freeb(b);
 					return err;
+				}
 				if((err = flushq(ctlr, 4)) != nil)
 					return err;
 			}
@@ -1451,7 +1453,7 @@
 
 	ilock(ctlr);
 	q = &ctlr->tx[qid];
-	while(!ctlr->broken && q->n >= Ntx){
+	while(q->n >= Ntx && !ctlr->broken){
 		iunlock(ctlr);
 		qlock(q);
 		if(!waserror()){
@@ -1662,7 +1664,7 @@
 		p += 2;				/* reserved */
 	}
 	if((err = cmd(ctlr, 16, c, p - c)) != nil){
-		print("rxon error: %s\n", err);
+		print("rxon: %s\n", err);
 		return;
 	}
 
@@ -1714,11 +1716,12 @@
 static void
 transmit(Wifi *wifi, Wnode *wn, Block *b)
 {
+	int flags, nodeid, rate;
 	uchar c[Tcmdsize], *p;
 	Ether *edev;
 	Ctlr *ctlr;
 	Wifipkt *w;
-	int flags, nodeid, rate;
+	char *err;
 
 	w = (Wifipkt*)b->rp;
 	edev = wifi->ether;
@@ -1794,7 +1797,10 @@
 	put16(p, 0);	/* timeout */
 	p += 2;
 	p += 2;		/* txop */
-	qcmd(ctlr, 0, 28, c, p - c, b);
+	if((err = qcmd(ctlr, 0, 28, c, p - c, b)) != nil){
+		print("transmit: %s\n", err);
+		freeb(b);
+	}
 }
 
 static long
--