X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=net%2Fatm%2Fresources.c;h=fd4b35b8d4eb48bd557757cce6b48b98cae0377b;hb=9bf4aaab3e101692164d49b7ca357651eb691cb6;hp=a72dc2d4284610b370b0a368daaf07883dd5e4fd;hpb=5273a3df6485dc2ad6aa7ddd441b9a21970f003b;p=linux-2.6.git diff --git a/net/atm/resources.c b/net/atm/resources.c index a72dc2d42..fd4b35b8d 100644 --- a/net/atm/resources.c +++ b/net/atm/resources.c @@ -180,7 +180,7 @@ static void subtract_aal_stats(struct k_atm_aal_stats *from, } -static int fetch_stats(struct atm_dev *dev, struct atm_dev_stats *arg, int zero) +static int fetch_stats(struct atm_dev *dev, struct atm_dev_stats __user *arg, int zero) { struct atm_dev_stats tmp; int error = 0; @@ -199,19 +199,20 @@ static int fetch_stats(struct atm_dev *dev, struct atm_dev_stats *arg, int zero) } -int atm_dev_ioctl(unsigned int cmd, unsigned long arg) +int atm_dev_ioctl(unsigned int cmd, void __user *arg) { - void *buf; + void __user *buf; int error, len, number, size = 0; struct atm_dev *dev; struct list_head *p; int *tmp_buf, *tmp_p; - + struct atm_iobuf __user *iobuf = arg; + struct atmif_sioc __user *sioc = arg; switch (cmd) { case ATM_GETNAMES: - if (get_user(buf, &((struct atm_iobuf *) arg)->buffer)) + if (get_user(buf, &iobuf->buffer)) return -EFAULT; - if (get_user(len, &((struct atm_iobuf *) arg)->length)) + if (get_user(len, &iobuf->length)) return -EFAULT; spin_lock(&atm_dev_lock); list_for_each(p, &atm_devs) @@ -232,7 +233,7 @@ int atm_dev_ioctl(unsigned int cmd, unsigned long arg) } spin_unlock(&atm_dev_lock); error = ((copy_to_user(buf, tmp_buf, size)) || - put_user(size, &((struct atm_iobuf *) arg)->length)) + put_user(size, &iobuf->length)) ? -EFAULT : 0; kfree(tmp_buf); return error; @@ -240,11 +241,11 @@ int atm_dev_ioctl(unsigned int cmd, unsigned long arg) break; } - if (get_user(buf, &((struct atmif_sioc *) arg)->arg)) + if (get_user(buf, &sioc->arg)) return -EFAULT; - if (get_user(len, &((struct atmif_sioc *) arg)->length)) + if (get_user(len, &sioc->length)) return -EFAULT; - if (get_user(number, &((struct atmif_sioc *) arg)->number)) + if (get_user(number, &sioc->number)) return -EFAULT; if (!(dev = atm_dev_lookup(number))) @@ -351,13 +352,13 @@ int atm_dev_ioctl(unsigned int cmd, unsigned long arg) size = error; /* may return 0, but later on size == 0 means "don't write the length" */ - error = put_user(size, &((struct atmif_sioc *) arg)->length) + error = put_user(size, &sioc->length) ? -EFAULT : 0; goto done; case ATM_SETLOOP: - if (__ATM_LM_XTRMT((int) (long) buf) && - __ATM_LM_XTLOC((int) (long) buf) > - __ATM_LM_XTRMT((int) (long) buf)) { + if (__ATM_LM_XTRMT((int) (unsigned long) buf) && + __ATM_LM_XTLOC((int) (unsigned long) buf) > + __ATM_LM_XTRMT((int) (unsigned long) buf)) { error = -EINVAL; goto done; } @@ -385,7 +386,7 @@ int atm_dev_ioctl(unsigned int cmd, unsigned long arg) } if (size) - error = put_user(size, &((struct atmif_sioc *) arg)->length) + error = put_user(size, &sioc->length) ? -EFAULT : 0; else error = 0;