devaoe: fix off by one in aoeerror(), consistent use of nil for pointers, error handling

This commit is contained in:
cinap_lenrek 2015-07-22 21:56:11 +02:00
parent 769b3f1c2f
commit 0b3fd7c052

View file

@ -309,7 +309,7 @@ srbcleanout(Aoedev *d, Srb *srb)
if(srb == d->inprocess) if(srb == d->inprocess)
d->inprocess = nil; d->inprocess = nil;
else else
for(ll = &d->head; x = *ll; ll = &x->next){ for(ll = &d->head; (x = *ll) != nil; ll = &x->next){
d->tail = x; d->tail = x;
if(x == srb) if(x == srb)
*ll = x->next; *ll = x->next;
@ -334,7 +334,7 @@ frameerror(Aoedev *d, Frame *f, char *s)
srb = f->srb; srb = f->srb;
f->srb = nil; f->srb = nil;
f->tag = Tfree; /* don't get fooled by way-slow responses */ f->tag = Tfree; /* don't get fooled by way-slow responses */
if(!srb) if(srb == nil)
return; return;
srb->nout--; srb->nout--;
srberror(d, srb, s); srberror(d, srb, s);
@ -375,15 +375,15 @@ eventlogread(void *a, long n)
/* the concern here is page faults in memmove below */ /* the concern here is page faults in memmove below */
if(waserror()){ if(waserror()){
free(buf);
qunlock(&events); qunlock(&events);
free(buf);
nexterror(); nexterror();
} }
memmove(a, buf, n); memmove(a, buf, n);
poperror(); poperror();
} }
free(buf);
qunlock(&events); qunlock(&events);
free(buf);
return n; return n;
} }
@ -502,16 +502,16 @@ pickdevlink(Aoedev *d)
for(i = 0; i < d->ndl; i++){ for(i = 0; i < d->ndl; i++){
n = d->dlidx++ % d->ndl; n = d->dlidx++ % d->ndl;
l = d->dl + n; l = d->dl + n;
if(l && l->flag & Dup) if(l->flag & Dup)
return l; return l;
} }
return 0; return nil;
} }
static int static int
pickea(Devlink *l) pickea(Devlink *l)
{ {
if(l == 0) if(l == nil)
return -1; return -1;
if(l->nea == 0) if(l->nea == 0)
return -1; return -1;
@ -530,7 +530,7 @@ hset(Aoedev *d, Frame *f, Aoehdr *h, int cmd, int new)
int i; int i;
Devlink *l; Devlink *l;
if(f->srb) if(f->srb != nil)
if((long)(Ticks-f->srb->ticksent) > Srbtimeout){ if((long)(Ticks-f->srb->ticksent) > Srbtimeout){
eventlog("%æ: srb timeout\n", d); eventlog("%æ: srb timeout\n", d);
if(cmd == ACata && Nofail(d, s)) if(cmd == ACata && Nofail(d, s))
@ -653,7 +653,7 @@ loop:
} }
starttick = Ticks; starttick = Ticks;
rlock(&devs); rlock(&devs);
for(d = devs.d; d; d = d->next){ for(d = devs.d; d != nil; d = d->next){
if(!canqlock(d)) if(!canqlock(d))
continue; continue;
if(!UP(d)){ if(!UP(d)){
@ -790,7 +790,7 @@ unitseq(Chan *c, uint unit, Dir *dp)
i = 0; i = 0;
rv = -1; rv = -1;
rlock(&devs); rlock(&devs);
for(d = devs.d; d; d = d->next) for(d = devs.d; d != nil; d = d->next)
if(i++ == unit){ if(i++ == unit){
mkqid(&q, QID(d->unit, Qunitdir), 0, QTDIR); mkqid(&q, QID(d->unit, Qunitdir), 0, QTDIR);
devdir(c, q, unitname(d), 0, eve, 0555, dp); devdir(c, q, unitname(d), 0, eve, 0555, dp);
@ -807,7 +807,7 @@ unit2dev(ulong unit)
Aoedev *d; Aoedev *d;
rlock(&devs); rlock(&devs);
for(d = devs.d; d; d = d->next) for(d = devs.d; d != nil; d = d->next)
if(d->unit == unit){ if(d->unit == unit){
runlock(&devs); runlock(&devs);
return d; return d;
@ -1102,9 +1102,9 @@ aoeerror(Aoehdr *h)
}; };
if((h->verflag & AFerr) == 0) if((h->verflag & AFerr) == 0)
return 0; return nil;
n = h->error; n = h->error;
if(n > nelem(errs)) if(n >= nelem(errs))
n = 0; n = 0;
return errs[n]; return errs[n];
} }
@ -1182,7 +1182,7 @@ strategy(Aoedev *d, Srb *srb)
if(!UP(d)) if(!UP(d))
error(Eio); error(Eio);
srb->next = nil; srb->next = nil;
if(d->tail) if(d->tail != nil)
d->tail->next = srb; d->tail->next = srb;
d->tail = srb; d->tail = srb;
if(d->head == nil) if(d->head == nil)
@ -1409,7 +1409,7 @@ topctlread(Chan *, void *db, int len, int off)
for(i = 0; i < Nnetlink; i++){ for(i = 0; i < Nnetlink; i++){
n = netlinks.nl+i; n = netlinks.nl+i;
if(n->cc == 0) if(n->cc == nil)
continue; continue;
p = seprint(p, e, "if%d path: %s\n", i, n->path); p = seprint(p, e, "if%d path: %s\n", i, n->path);
p = seprint(p, e, "if%d ea: %E\n", i, n->ea); p = seprint(p, e, "if%d ea: %E\n", i, n->ea);
@ -1707,7 +1707,7 @@ addnet(char *path, Chan *cc, Chan *dc, Chan *mtu, uchar *ea)
} }
nl = netlinks.nl; nl = netlinks.nl;
e = nl + nelem(netlinks.nl); e = nl + nelem(netlinks.nl);
for(; nl < e && nl->cc; nl++) for(; nl < e && nl->cc != nil; nl++)
continue; continue;
if(nl == e) if(nl == e)
error("out of netlink structures"); error("out of netlink structures");
@ -2249,11 +2249,9 @@ getaddr(char *path, uchar *ea)
cclose(c); cclose(c);
nexterror(); nexterror();
} }
if(c == nil)
panic("æ: getaddr: c == nil");
n = devtab[c->type]->read(c, buf, sizeof buf-1, 0); n = devtab[c->type]->read(c, buf, sizeof buf-1, 0);
poperror();
cclose(c); cclose(c);
poperror();
buf[n] = 0; buf[n] = 0;
if(parseether(ea, buf) < 0) if(parseether(ea, buf) < 0)
error("parseether failure"); error("parseether failure");
@ -2270,21 +2268,19 @@ netbind(char *path)
snprint(addr, sizeof addr, "%s!0x%x", path, Aoetype); snprint(addr, sizeof addr, "%s!0x%x", path, Aoetype);
dc = chandial(addr, nil, nil, &cc); dc = chandial(addr, nil, nil, &cc);
snprint(addr, sizeof addr, "%s/mtu", path); snprint(addr, sizeof addr, "%s/mtu", path);
if(waserror()) mtu = nil;
mtu = nil; if(!waserror()){
else {
mtu = namec(addr, Aopen, OREAD, 0); mtu = namec(addr, Aopen, OREAD, 0);
poperror(); poperror();
} }
if(waserror()){ if(waserror()){
cclose(dc); cclose(dc);
cclose(cc); cclose(cc);
if(mtu) if(mtu != nil)
cclose(mtu); cclose(mtu);
nexterror(); nexterror();
} }
if(dc == nil || cc == nil) if(dc == nil || cc == nil)
error(Enonexist); error(Enonexist);
getaddr(path, ea); getaddr(path, ea);
nl = addnet(path, cc, dc, mtu, ea); nl = addnet(path, cc, dc, mtu, ea);
@ -2346,7 +2342,7 @@ netunbind(char *path)
/* reschedule packets. */ /* reschedule packets. */
wlock(&devs); wlock(&devs);
for(d = devs.d; d; d = d->next){ for(d = devs.d; d != nil; d = d->next){
qlock(d); qlock(d);
for(i = 0; i < d->nframes; i++){ for(i = 0; i < d->nframes; i++){
f = d->frames + i; f = d->frames + i;
@ -2359,7 +2355,7 @@ netunbind(char *path)
/* squeeze devlink pool. (we assert nobody is using them now) */ /* squeeze devlink pool. (we assert nobody is using them now) */
wlock(&devs); wlock(&devs);
for(d = devs.d; d; d = d->next){ for(d = devs.d; d != nil; d = d->next){
qlock(d); qlock(d);
for(i = 0; i < d->ndl; i++){ for(i = 0; i < d->ndl; i++){
l = d->dl + i; l = d->dl + i;
@ -2374,7 +2370,7 @@ netunbind(char *path)
lock(&netlinks); lock(&netlinks);
dc = n->dc; dc = n->dc;
cc = n->cc; cc = n->cc;
if(n->mtu) if(n->mtu != nil)
cclose(n->mtu); cclose(n->mtu);
memset(n, 0, sizeof *n); memset(n, 0, sizeof *n);
unlock(&netlinks); unlock(&netlinks);
@ -2384,7 +2380,7 @@ netunbind(char *path)
/* squeeze orphan devices */ /* squeeze orphan devices */
wlock(&devs); wlock(&devs);
for(p = d = devs.d; d; d = next){ for(p = d = devs.d; d != nil; d = next){
next = d->next; next = d->next;
if(d->ndl > 0){ if(d->ndl > 0){
p = d; p = d;
@ -2413,7 +2409,7 @@ strtoss(char *f, uint *shelf, uint *slot)
*shelf = 0xffff; *shelf = 0xffff;
*slot = 0xff; *slot = 0xff;
if(!f) if(f == nil)
return; return;
*shelf = strtol(f, &s, 0); *shelf = strtol(f, &s, 0);
if(s == f || *shelf > 0xffff) if(s == f || *shelf > 0xffff)
@ -2444,7 +2440,7 @@ removedev(Aoedev *d)
wlock(&devs); wlock(&devs);
p = 0; p = 0;
if(d != devs.d) if(d != devs.d)
for(p = devs.d; p; p = p->next) for(p = devs.d; p != nil; p = p->next)
if(p->next == d) if(p->next == d)
break; break;
qlock(d); qlock(d);
@ -2455,7 +2451,7 @@ removedev(Aoedev *d)
for(i = 0; i < d->nframes; i++) for(i = 0; i < d->nframes; i++)
frameerror(d, d->frames+i, Enotup); frameerror(d, d->frames+i, Enotup);
if(p) if(p != nil)
p->next = d->next; p->next = d->next;
else else
devs.d = d->next; devs.d = d->next;
@ -2494,7 +2490,7 @@ removestr(char *f)
strtoss(f, &shelf, &slot); strtoss(f, &shelf, &slot);
wlock(&devs); wlock(&devs);
for(d = devs.d; d; d = d->next) for(d = devs.d; d != nil; d = d->next)
if(shelf == d->major && slot == d->minor){ if(shelf == d->major && slot == d->minor){
wunlock(&devs); /* BOTCH */ wunlock(&devs); /* BOTCH */
removedev(d); removedev(d);