Remove a couple of opportunities to panic when usb ctl gets bad arguments. Also make error messages slightly more consistent. Reference: /n/sources/patch/applied/devusb-args Date: Tue Feb 12 23:26:13 CET 2008 Signed-off-by: miller@hamnavoe.com --- /sys/src/9/pc/devusb.c Tue Feb 12 23:24:34 2008 +++ /sys/src/9/pc/devusb.c Tue Feb 12 23:24:31 2008 @@ -786,7 +786,7 @@ break; case CMclass: if (cb->nf != 5 && cb->nf != 7) - cmderror(cb, Ebadusbmsg); + cmderror(cb, Ecmdargs); /* * class #ifc ept csp * (== class subclass proto) [vendor product] @@ -874,6 +874,8 @@ * Isomode: ep n period mode samplesize Hz OR * Intrmode: ep n period mode maxpkt */ + if(cb->nf < 3) + error(Ecmdargs); i = strtoul(cb->f[1], nil, 0); if(i < 0 || i >= nelem(d->ep)) { XPRINT("field 1: 0 <= %d < %d\n", @@ -885,17 +887,19 @@ e = devendpt(d, i, 1); } qlock(uh); + if(e->active){ + qunlock(uh); + error(Eperm); + } if(waserror()){ freept(e); qunlock(uh); nexterror(); } - if(e->active) - error(Eperm); if(strcmp(cb->f[2], "bulk") == 0){ /* ep n `bulk' mode maxpkt nbuf */ if(cb->nf != 6) - error("arg count"); + error(Ecmdargs); i = strtoul(cb->f[4], nil, 0); if(i < 1 || i > 1023){ XPRINT("maxpkt: 1 <= %d < 1024\n", i); @@ -912,7 +916,7 @@ }else if(strcmp(cb->f[2], "ctl") == 0){ /* ep n `ctl' mode maxpkt nbuf */ if(cb->nf != 6) - error("arg count"); + error(Ecmdargs); i = strtoul(cb->f[4], nil, 0); if(i < 8 || i > 1023){ XPRINT("maxpkt: 8 <= %d < 1024\n", i); @@ -973,7 +977,7 @@ e->samplesz; e->epnewmode = Isomode; }else - error("arg count"); + error(Ecmdargs); e->mode = strcmp(cb->f[3],"r") == 0? OREAD: strcmp(cb->f[3],"w") == 0? OWRITE: ORDWR; uh->epmode(uh, e);