ref: b2d79920255fc405b972e4c900e47f4a1046e044
parent: d3f4786a1fcfb3cf8eba0cad2457622c6487e0e9
author: cinap_lenrek <[email protected]>
date: Sun Feb 25 12:11:18 EST 2018
kernel: properly handle bad attach specifiers - only accept decimal for numeric device id's - exclude negative device id's - device id's out of range yield Enodev
--- a/sys/src/9/ip/devip.c
+++ b/sys/src/9/ip/devip.c
@@ -277,12 +277,12 @@
static Chan*
ipattach(char* spec)
{
- ulong dev;
Chan *c;
+ ulong dev;
- dev = strtoul(spec, nil, 0);
+ dev = strtoul(spec, nil, 10);
if(dev >= Nfs)
- error(Ebadspec);
+ error(Enodev);
qlock(&fslock);
if(ipfs[dev] == nil){
--- a/sys/src/9/pc/devvga.c
+++ b/sys/src/9/pc/devvga.c
@@ -90,7 +90,7 @@
vgaattach(char* spec)
{
if(*spec && strcmp(spec, "0"))
- error(Eio);
+ error(Enodev);
return devattach('v', spec);
}
--- a/sys/src/9/port/devaudio.c
+++ b/sys/src/9/port/devaudio.c
@@ -120,16 +120,13 @@
static Chan*
audioattach(char *spec)
{
- static int attached = 0;
+ static ulong attached = 0;
Audiochan *ac;
Audio *adev;
Chan *c;
- int i;
+ ulong i;
- if(spec != nil && *spec != '\0')
- i = strtol(spec, 0, 10);
- else
- i = 0;
+ i = strtoul(spec, nil, 10);
for(adev = audiodevs; adev; adev = adev->next)
if(adev->ctlrno == i)
break;
--- a/sys/src/9/port/devbridge.c
+++ b/sys/src/9/port/devbridge.c
@@ -193,14 +193,14 @@
}
static Chan*
-bridgeattach(char* spec)
+bridgeattach(char *spec)
{
Chan *c;
- int dev;
+ ulong dev;
- dev = atoi(spec);
- if(dev<0 || dev >= Maxbridge)
- error("bad specification");
+ dev = strtoul(spec, nil, 10);
+ if(dev >= Maxbridge)
+ error(Enodev);
c = devattach('B', spec);
mkqid(&c->qid, QID(0, Qtopdir), 0, QTDIR);
--- a/sys/src/9/port/devether.c
+++ b/sys/src/9/port/devether.c
@@ -25,7 +25,7 @@
ctlrno = 0;
if(*spec){
- ctlrno = strtoul(spec, &conf, 0);
+ ctlrno = strtoul(spec, &conf, 10);
if(ctlrno >= MaxEther)
error(Enodev);
if(conf == spec)
--- a/sys/src/9/port/devflash.c
+++ b/sys/src/9/port/devflash.c
@@ -167,11 +167,11 @@
flashattach(char *spec)
{
Flash *f;
- int bank;
Chan *c;
+ ulong bank;
- bank = strtol(spec, nil, 0);
- if(bank < 0 || bank >= Nbanks ||
+ bank = strtoul(spec, nil, 10);
+ if(bank >= Nbanks ||
(f = flash.card[bank]) == nil ||
f->attach != nil && f->attach(f) < 0)
error(Enodev);
--- a/sys/src/9/port/devloopback.c
+++ b/sys/src/9/port/devloopback.c
@@ -121,14 +121,11 @@
Queue *q;
Chan *c;
int chan;
- int dev;
+ ulong dev;
- dev = 0;
- if(spec != nil){
- dev = atoi(spec);
- if(dev >= Nloopbacks)
- error(Ebadspec);
- }
+ dev = strtoul(spec, nil, 10);
+ if(dev >= Nloopbacks)
+ error(Enodev);
c = devattach('X', spec);
if(waserror()){
--- a/sys/src/9/port/devsd.c
+++ b/sys/src/9/port/devsd.c
@@ -662,8 +662,8 @@
if(spec[0] != 's' || spec[1] != 'd')
error(Ebadspec);
idno = spec[2];
- subno = strtol(&spec[3], &p, 0);
- if(p == &spec[3])
+ subno = strtol(&spec[3], &p, 10);
+ if(subno < 0 || p == &spec[3])
error(Ebadspec);
if((sdev=sdgetdev(idno)) == nil)
--- a/sys/src/9/port/devsdp.c
+++ b/sys/src/9/port/devsdp.c
@@ -364,14 +364,14 @@
sdpattach(char* spec)
{
Chan *c;
- int dev;
char buf[100];
Sdp *sdp;
int start;
+ ulong dev;
- dev = atoi(spec);
- if(dev<0 || dev >= Nfs)
- error("bad specification");
+ dev = strtoul(spec, nil, 10);
+ if(dev >= Nfs)
+ error(Enodev);
c = devattach('E', spec);
c->qid = (Qid){QID(0, Qtopdir), 0, QTDIR};
@@ -384,7 +384,7 @@
qunlock(sdp);
if(start) {
- snprint(buf, sizeof(buf), "sdpackproc%d", dev);
+ snprint(buf, sizeof(buf), "sdpackproc%lud", dev);
kproc(buf, sdpackproc, sdp);
}