atm: move copyin from atm_getnames() into the caller

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Al Viro 2020-05-10 17:34:20 -04:00
parent 8c2348e36a
commit a3929484af
3 changed files with 20 additions and 20 deletions

View File

@ -56,6 +56,8 @@ static int do_vcc_ioctl(struct socket *sock, unsigned int cmd,
int error; int error;
struct list_head *pos; struct list_head *pos;
void __user *argp = (void __user *)arg; void __user *argp = (void __user *)arg;
void __user *buf;
int __user *len;
vcc = ATM_SD(sock); vcc = ATM_SD(sock);
switch (cmd) { switch (cmd) {
@ -163,7 +165,22 @@ static int do_vcc_ioctl(struct socket *sock, unsigned int cmd,
goto done; goto done;
if (cmd == ATM_GETNAMES) { if (cmd == ATM_GETNAMES) {
error = atm_getnames(argp, compat); if (IS_ENABLED(CONFIG_COMPAT) && compat) {
#ifdef CONFIG_COMPAT
struct compat_atm_iobuf __user *ciobuf = argp;
compat_uptr_t cbuf;
len = &ciobuf->length;
if (get_user(cbuf, &ciobuf->buffer))
return -EFAULT;
buf = compat_ptr(cbuf);
#endif
} else {
struct atm_iobuf __user *iobuf = argp;
len = &iobuf->length;
if (get_user(buf, &iobuf->buffer))
return -EFAULT;
}
error = atm_getnames(buf, len);
} else { } else {
error = atm_dev_ioctl(cmd, argp, compat); error = atm_dev_ioctl(cmd, argp, compat);
} }

View File

@ -193,30 +193,13 @@ static int fetch_stats(struct atm_dev *dev, struct atm_dev_stats __user *arg,
return error ? -EFAULT : 0; return error ? -EFAULT : 0;
} }
int atm_getnames(void __user *arg, int compat) int atm_getnames(void __user *buf, int __user *iobuf_len)
{ {
void __user *buf;
int error, len, size = 0; int error, len, size = 0;
struct atm_dev *dev; struct atm_dev *dev;
struct list_head *p; struct list_head *p;
int *tmp_buf, *tmp_p; int *tmp_buf, *tmp_p;
int __user *iobuf_len;
if (IS_ENABLED(CONFIG_COMPAT) && compat) {
#ifdef CONFIG_COMPAT
struct compat_atm_iobuf __user *ciobuf = arg;
compat_uptr_t cbuf;
iobuf_len = &ciobuf->length;
if (get_user(cbuf, &ciobuf->buffer))
return -EFAULT;
buf = compat_ptr(cbuf);
#endif
} else {
struct atm_iobuf __user *iobuf = arg;
iobuf_len = &iobuf->length;
if (get_user(buf, &iobuf->buffer))
return -EFAULT;
}
if (get_user(len, iobuf_len)) if (get_user(len, iobuf_len))
return -EFAULT; return -EFAULT;
mutex_lock(&atm_dev_mutex); mutex_lock(&atm_dev_mutex);

View File

@ -14,7 +14,7 @@
extern struct list_head atm_devs; extern struct list_head atm_devs;
extern struct mutex atm_dev_mutex; extern struct mutex atm_dev_mutex;
int atm_getnames(void __user *arg, int compat); int atm_getnames(void __user *buf, int __user *iobuf_len);
int atm_dev_ioctl(unsigned int cmd, void __user *arg, int compat); int atm_dev_ioctl(unsigned int cmd, void __user *arg, int compat);