Commit a3929484 authored by Al Viro's avatar Al Viro
Browse files

atm: move copyin from atm_getnames() into the caller



Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 8c2348e3
Loading
Loading
Loading
Loading
+18 −1
Original line number Diff line number Diff line
@@ -56,6 +56,8 @@ static int do_vcc_ioctl(struct socket *sock, unsigned int cmd,
	int error;
	struct list_head *pos;
	void __user *argp = (void __user *)arg;
	void __user *buf;
	int __user *len;

	vcc = ATM_SD(sock);
	switch (cmd) {
@@ -163,7 +165,22 @@ static int do_vcc_ioctl(struct socket *sock, unsigned int cmd,
		goto done;

	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 {
		error = atm_dev_ioctl(cmd, argp, compat);
	}
+1 −18
Original line number Diff line number Diff line
@@ -193,30 +193,13 @@ static int fetch_stats(struct atm_dev *dev, struct atm_dev_stats __user *arg,
	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;
	struct atm_dev *dev;
	struct list_head *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))
		return -EFAULT;
	mutex_lock(&atm_dev_mutex);
+1 −1
Original line number Diff line number Diff line
@@ -14,7 +14,7 @@
extern struct list_head atm_devs;
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);