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
--
⑨