OSDN Git Service

atm: lift copyin from atm_dev_ioctl()
authorAl Viro <viro@zeniv.linux.org.uk>
Sun, 10 May 2020 21:53:35 +0000 (17:53 -0400)
committerAl Viro <viro@zeniv.linux.org.uk>
Thu, 21 May 2020 00:31:35 +0000 (20:31 -0400)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
net/atm/ioctl.c
net/atm/resources.c
net/atm/resources.h

index fdd0e34..52f2c77 100644 (file)
@@ -182,7 +182,30 @@ static int do_vcc_ioctl(struct socket *sock, unsigned int cmd,
                }
                error = atm_getnames(buf, len);
        } else {
-               error = atm_dev_ioctl(cmd, argp, compat);
+               int number;
+
+               if (IS_ENABLED(CONFIG_COMPAT) && compat) {
+#ifdef CONFIG_COMPAT
+                       struct compat_atmif_sioc __user *csioc = argp;
+                       compat_uptr_t carg;
+
+                       len = &csioc->length;
+                       if (get_user(carg, &csioc->arg))
+                               return -EFAULT;
+                       buf = compat_ptr(carg);
+                       if (get_user(number, &csioc->number))
+                               return -EFAULT;
+#endif
+               } else {
+                       struct atmif_sioc __user *sioc = argp;
+
+                       len = &sioc->length;
+                       if (get_user(buf, &sioc->arg))
+                               return -EFAULT;
+                       if (get_user(number, &sioc->number))
+                               return -EFAULT;
+               }
+               error = atm_dev_ioctl(cmd, buf, len, number, compat);
        }
 
 done:
index 5507cc6..94bdc65 100644 (file)
@@ -227,39 +227,14 @@ int atm_getnames(void __user *buf, int __user *iobuf_len)
        return error;
 }
 
-int atm_dev_ioctl(unsigned int cmd, void __user *arg, int compat)
+int atm_dev_ioctl(unsigned int cmd, void __user *buf, int __user *sioc_len,
+                 int number, int compat)
 {
-       void __user *buf;
-       int error, len, number, size = 0;
+       int error, len, size = 0;
        struct atm_dev *dev;
-       int __user *sioc_len;
 
-       if (IS_ENABLED(CONFIG_COMPAT) && compat) {
-#ifdef CONFIG_COMPAT
-               struct compat_atmif_sioc __user *csioc = arg;
-               compat_uptr_t carg;
-
-               sioc_len = &csioc->length;
-               if (get_user(carg, &csioc->arg))
-                       return -EFAULT;
-               buf = compat_ptr(carg);
-
-               if (get_user(len, &csioc->length))
-                       return -EFAULT;
-               if (get_user(number, &csioc->number))
-                       return -EFAULT;
-#endif
-       } else {
-               struct atmif_sioc __user *sioc = arg;
-
-               sioc_len = &sioc->length;
-               if (get_user(buf, &sioc->arg))
-                       return -EFAULT;
-               if (get_user(len, &sioc->length))
-                       return -EFAULT;
-               if (get_user(number, &sioc->number))
-                       return -EFAULT;
-       }
+       if (get_user(len, sioc_len))
+               return -EFAULT;
 
        dev = try_then_request_module(atm_dev_lookup(number), "atm-device-%d",
                                      number);
index 5e2c68d..4a0839e 100644 (file)
@@ -15,8 +15,8 @@ extern struct list_head atm_devs;
 extern struct mutex atm_dev_mutex;
 
 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 *buf, int __user *sioc_len,
+                 int number, int compat);
 
 #ifdef CONFIG_PROC_FS