Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 668a9541 authored by Christopher Li's avatar Christopher Li Committed by Greg Kroah-Hartman
Browse files

[PATCH] USB: bug fix in usbdevfs



I am sorry that the last patch about 32 bit compat ioctl on
64 bit kernel actually breaks the usbdevfs. That is on the current
BK tree. I am retarded. 

Here is the patch to fix it. Tested with USB hard disk and webcam
in both 32bit compatible mode and native 64bit mode.

Again, sorry about that.


From: Christopher Li <chrisl@vmware.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
parent a81e7ecc
Loading
Loading
Loading
Loading
+19 −21
Original line number Diff line number Diff line
@@ -1032,8 +1032,7 @@ static int processcompl(struct async *as, void __user * __user *arg)
	if (put_user(urb->error_count, &userurb->error_count))
		return -EFAULT;

	if (!(usb_pipeisoc(urb->pipe)))
		return 0;
	if (usb_pipeisoc(urb->pipe)) {
		for (i = 0; i < urb->number_of_packets; i++) {
			if (put_user(urb->iso_frame_desc[i].actual_length,
				     &userurb->iso_frame_desc[i].actual_length))
@@ -1042,6 +1041,7 @@ static int processcompl(struct async *as, void __user * __user *arg)
				     &userurb->iso_frame_desc[i].status))
				return -EFAULT;
		}
	}

	free_async(as);

@@ -1126,7 +1126,7 @@ static int proc_submiturb_compat(struct dev_state *ps, void __user *arg)
	if (get_urb32(&uurb,(struct usbdevfs_urb32 *)arg))
		return -EFAULT;

	return proc_do_submiturb(ps, &uurb, ((struct usbdevfs_urb __user *)arg)->iso_frame_desc, arg);
	return proc_do_submiturb(ps, &uurb, ((struct usbdevfs_urb32 __user *)arg)->iso_frame_desc, arg);
}

static int processcompl_compat(struct async *as, void __user * __user *arg)
@@ -1146,8 +1146,7 @@ static int processcompl_compat(struct async *as, void __user * __user *arg)
	if (put_user(urb->error_count, &userurb->error_count))
		return -EFAULT;

	if (!(usb_pipeisoc(urb->pipe)))
		return 0;
	if (usb_pipeisoc(urb->pipe)) {
		for (i = 0; i < urb->number_of_packets; i++) {
			if (put_user(urb->iso_frame_desc[i].actual_length,
				     &userurb->iso_frame_desc[i].actual_length))
@@ -1156,6 +1155,7 @@ static int processcompl_compat(struct async *as, void __user * __user *arg)
				     &userurb->iso_frame_desc[i].status))
				return -EFAULT;
		}
	}

	free_async(as);
	if (put_user((u32)(u64)addr, (u32 __user *)arg))
@@ -1177,10 +1177,8 @@ static int proc_reapurbnonblock_compat(struct dev_state *ps, void __user *arg)
{
	struct async *as;

	printk("reapurbnblock\n");
	if (!(as = async_getcompleted(ps)))
		return -EAGAIN;
	printk("reap got as %p\n", as);
	return processcompl_compat(as, (void __user * __user *)arg);
}