mirror of https://gitee.com/openkylin/linux.git
atm: move copyin from atm_getnames() into the caller
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
8c2348e36a
commit
a3929484af
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue