|
Lines 30-35
Link Here
|
| 30 |
* Revision history |
30 |
* Revision history |
| 31 |
* 22.12.1999 0.1 Initial release (split from proc_usb.c) |
31 |
* 22.12.1999 0.1 Initial release (split from proc_usb.c) |
| 32 |
* 04.01.2000 0.2 Turned into its own filesystem |
32 |
* 04.01.2000 0.2 Turned into its own filesystem |
|
|
33 |
* 30.09.2005 0.3 Fix user-triggerable oops in async URB delivery |
| 34 |
* (CAN-2005-3055) |
| 33 |
*/ |
35 |
*/ |
| 34 |
|
36 |
|
| 35 |
/*****************************************************************************/ |
37 |
/*****************************************************************************/ |
|
Lines 58-64
static struct class *usb_device_class;
Link Here
|
| 58 |
struct async { |
60 |
struct async { |
| 59 |
struct list_head asynclist; |
61 |
struct list_head asynclist; |
| 60 |
struct dev_state *ps; |
62 |
struct dev_state *ps; |
| 61 |
struct task_struct *task; |
63 |
pid_t pid; |
|
|
64 |
uid_t uid, euid; |
| 62 |
unsigned int signr; |
65 |
unsigned int signr; |
| 63 |
unsigned int ifnum; |
66 |
unsigned int ifnum; |
| 64 |
void __user *userbuffer; |
67 |
void __user *userbuffer; |
|
Lines 290-296
static void async_completed(struct urb *
Link Here
|
| 290 |
sinfo.si_errno = as->urb->status; |
293 |
sinfo.si_errno = as->urb->status; |
| 291 |
sinfo.si_code = SI_ASYNCIO; |
294 |
sinfo.si_code = SI_ASYNCIO; |
| 292 |
sinfo.si_addr = as->userurb; |
295 |
sinfo.si_addr = as->userurb; |
| 293 |
send_sig_info(as->signr, &sinfo, as->task); |
296 |
kill_proc_info_as_uid(as->signr, &sinfo, as->pid, as->uid, |
|
|
297 |
as->euid); |
| 294 |
} |
298 |
} |
| 295 |
wake_up(&ps->wait); |
299 |
wake_up(&ps->wait); |
| 296 |
} |
300 |
} |
|
Lines 988-994
static int proc_do_submiturb(struct dev_
Link Here
|
| 988 |
as->userbuffer = NULL; |
992 |
as->userbuffer = NULL; |
| 989 |
as->signr = uurb->signr; |
993 |
as->signr = uurb->signr; |
| 990 |
as->ifnum = ifnum; |
994 |
as->ifnum = ifnum; |
| 991 |
as->task = current; |
995 |
as->pid = current->pid; |
|
|
996 |
as->uid = current->uid; |
| 997 |
as->euid = current->euid; |
| 992 |
if (!(uurb->endpoint & USB_DIR_IN)) { |
998 |
if (!(uurb->endpoint & USB_DIR_IN)) { |
| 993 |
if (copy_from_user(as->urb->transfer_buffer, uurb->buffer, as->urb->transfer_buffer_length)) { |
999 |
if (copy_from_user(as->urb->transfer_buffer, uurb->buffer, as->urb->transfer_buffer_length)) { |
| 994 |
free_async(as); |
1000 |
free_async(as); |