diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-02-15 22:56:54 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-02-15 22:56:54 +0100 |
commit | 126d7e6feb31c0e89943674238929c2748341556 (patch) | |
tree | c4c28dd0501a517cdf4aba8f3d1e7871ca5b4cfd /sys/src/9/pc/etheriwl.c | |
parent | 8deac637d7b50ebb62a742e1c1e4a5cc47d168b3 (diff) |
etheriwl: avoid leaking blocks when controller breaks
Diffstat (limited to 'sys/src/9/pc/etheriwl.c')
-rw-r--r-- | sys/src/9/pc/etheriwl.c | 16 |
1 files changed, 11 insertions, 5 deletions
diff --git a/sys/src/9/pc/etheriwl.c b/sys/src/9/pc/etheriwl.c index 746535b47..5fee696a8 100644 --- a/sys/src/9/pc/etheriwl.c +++ b/sys/src/9/pc/etheriwl.c @@ -1263,8 +1263,10 @@ postboot(Ctlr *ctlr) 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 @@ qcmd(Ctlr *ctlr, uint qid, uint code, uchar *data, int size, Block *block) 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 @@ rxon(Ether *edev, Wnode *bss) 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 @@ enum { 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 @@ transmit(Wifi *wifi, Wnode *wn, Block *b) 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 |