[PATCH] devio __user annotations
[firefly-linux-kernel-4.4.55.git] / drivers / usb / core / devio.c
index 71bbd25a4ed03a8689fea58944110bcf863ec9a7..724822cac2b1091894e63053af410777f29a8049 100644 (file)
@@ -65,7 +65,7 @@ DEFINE_MUTEX(usbfs_mutex);
 struct async {
        struct list_head asynclist;
        struct dev_state *ps;
-       pid_t pid;
+       struct pid *pid;
        uid_t uid, euid;
        unsigned int signr;
        unsigned int ifnum;
@@ -122,7 +122,7 @@ static loff_t usbdev_lseek(struct file *file, loff_t offset, int orig)
 
 static ssize_t usbdev_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos)
 {
-       struct dev_state *ps = (struct dev_state *)file->private_data;
+       struct dev_state *ps = file->private_data;
        struct usb_device *dev = ps->dev;
        ssize_t ret = 0;
        unsigned len;
@@ -225,6 +225,7 @@ static struct async *alloc_async(unsigned int numisoframes)
 
 static void free_async(struct async *as)
 {
+       put_pid(as->pid);
        kfree(as->urb->transfer_buffer);
        kfree(as->urb->setup_packet);
        usb_free_urb(as->urb);
@@ -303,9 +304,9 @@ static void snoop_urb(struct urb *urb, void __user *userurb)
        printk("\n");
 }
 
-static void async_completed(struct urb *urb, struct pt_regs *regs)
+static void async_completed(struct urb *urb)
 {
-        struct async *as = (struct async *)urb->context;
+        struct async *as = urb->context;
         struct dev_state *ps = as->ps;
        struct siginfo sinfo;
 
@@ -317,7 +318,7 @@ static void async_completed(struct urb *urb, struct pt_regs *regs)
                sinfo.si_errno = as->urb->status;
                sinfo.si_code = SI_ASYNCIO;
                sinfo.si_addr = as->userurb;
-               kill_proc_info_as_uid(as->signr, &sinfo, as->pid, as->uid, 
+               kill_pid_info_as_uid(as->signr, &sinfo, as->pid, as->uid,
                                      as->euid, as->secid);
        }
        snoop(&urb->dev->dev, "urb complete\n");
@@ -573,7 +574,7 @@ static int usbdev_open(struct inode *inode, struct file *file)
        INIT_LIST_HEAD(&ps->async_completed);
        init_waitqueue_head(&ps->wait);
        ps->discsignr = 0;
-       ps->disc_pid = current->pid;
+       ps->disc_pid = get_pid(task_pid(current));
        ps->disc_uid = current->uid;
        ps->disc_euid = current->euid;
        ps->disccontext = NULL;
@@ -591,7 +592,7 @@ static int usbdev_open(struct inode *inode, struct file *file)
 
 static int usbdev_release(struct inode *inode, struct file *file)
 {
-       struct dev_state *ps = (struct dev_state *)file->private_data;
+       struct dev_state *ps = file->private_data;
        struct usb_device *dev = ps->dev;
        unsigned int ifnum;
 
@@ -611,6 +612,7 @@ static int usbdev_release(struct inode *inode, struct file *file)
        usb_autosuspend_device(dev, 1);
        usb_unlock_device(dev);
        usb_put_dev(dev);
+       put_pid(ps->disc_pid);
        kfree(ps);
        return 0;
 }
@@ -1063,7 +1065,7 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb,
                as->userbuffer = NULL;
        as->signr = uurb->signr;
        as->ifnum = ifnum;
-       as->pid = current->pid;
+       as->pid = get_pid(task_pid(current));
        as->uid = current->uid;
        as->euid = current->euid;
        security_task_getsecid(current, &as->secid);
@@ -1214,7 +1216,7 @@ static int proc_submiturb_compat(struct dev_state *ps, void __user *arg)
 {
        struct usbdevfs_urb uurb;
 
-       if (get_urb32(&uurb,(struct usbdevfs_urb32 *)arg))
+       if (get_urb32(&uurb,(struct usbdevfs_urb32 __user *)arg))
                return -EFAULT;
 
        return proc_do_submiturb(ps, &uurb, ((struct usbdevfs_urb32 __user *)arg)->iso_frame_desc, arg);
@@ -1249,7 +1251,7 @@ static int processcompl_compat(struct async *as, void __user * __user *arg)
        }
 
        free_async(as);
-       if (put_user((u32)(u64)addr, (u32 __user *)arg))
+       if (put_user(ptr_to_compat(addr), (u32 __user *)arg))
                return -EFAULT;
        return 0;
 }
@@ -1423,7 +1425,7 @@ static int proc_ioctl_compat(struct dev_state *ps, compat_uptr_t arg)
  */
 static int usbdev_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg)
 {
-       struct dev_state *ps = (struct dev_state *)file->private_data;
+       struct dev_state *ps = file->private_data;
        struct usb_device *dev = ps->dev;
        void __user *p = (void __user *)arg;
        int ret = -ENOTTY;
@@ -1518,7 +1520,7 @@ static int usbdev_ioctl(struct inode *inode, struct file *file, unsigned int cmd
 
        case USBDEVFS_IOCTL32:
                snoop(&dev->dev, "%s: IOCTL\n", __FUNCTION__);
-               ret = proc_ioctl_compat(ps, (compat_uptr_t)(long)p);
+               ret = proc_ioctl_compat(ps, ptr_to_compat(p));
                break;
 #endif
 
@@ -1566,8 +1568,8 @@ static int usbdev_ioctl(struct inode *inode, struct file *file, unsigned int cmd
 /* No kernel lock - fine */
 static unsigned int usbdev_poll(struct file *file, struct poll_table_struct *wait)
 {
-       struct dev_state *ps = (struct dev_state *)file->private_data;
-        unsigned int mask = 0;
+       struct dev_state *ps = file->private_data;
+       unsigned int mask = 0;
 
        poll_wait(file, &ps->wait, wait);
        if (file->f_mode & FMODE_WRITE && !list_empty(&ps->async_completed))