|
@@ -47,6 +47,7 @@
|
|
|
#include <linux/usbdevice_fs.h>
|
|
|
#include <linux/cdev.h>
|
|
|
#include <linux/notifier.h>
|
|
|
+#include <linux/security.h>
|
|
|
#include <asm/uaccess.h>
|
|
|
#include <asm/byteorder.h>
|
|
|
#include <linux/moduleparam.h>
|
|
@@ -68,6 +69,7 @@ struct async {
|
|
|
void __user *userbuffer;
|
|
|
void __user *userurb;
|
|
|
struct urb *urb;
|
|
|
+ u32 secid;
|
|
|
};
|
|
|
|
|
|
static int usbfs_snoop = 0;
|
|
@@ -312,7 +314,7 @@ static void async_completed(struct urb *urb, struct pt_regs *regs)
|
|
|
sinfo.si_code = SI_ASYNCIO;
|
|
|
sinfo.si_addr = as->userurb;
|
|
|
kill_proc_info_as_uid(as->signr, &sinfo, as->pid, as->uid,
|
|
|
- as->euid);
|
|
|
+ as->euid, as->secid);
|
|
|
}
|
|
|
snoop(&urb->dev->dev, "urb complete\n");
|
|
|
snoop_urb(urb, as->userurb);
|
|
@@ -572,6 +574,7 @@ static int usbdev_open(struct inode *inode, struct file *file)
|
|
|
ps->disc_euid = current->euid;
|
|
|
ps->disccontext = NULL;
|
|
|
ps->ifclaimed = 0;
|
|
|
+ security_task_getsecid(current, &ps->secid);
|
|
|
wmb();
|
|
|
list_add_tail(&ps->list, &dev->filelist);
|
|
|
file->private_data = ps;
|
|
@@ -1053,6 +1056,7 @@ static int proc_do_submiturb(struct dev_state *ps, struct usbdevfs_urb *uurb,
|
|
|
as->pid = current->pid;
|
|
|
as->uid = current->uid;
|
|
|
as->euid = current->euid;
|
|
|
+ security_task_getsecid(current, &as->secid);
|
|
|
if (!(uurb->endpoint & USB_DIR_IN)) {
|
|
|
if (copy_from_user(as->urb->transfer_buffer, uurb->buffer, as->urb->transfer_buffer_length)) {
|
|
|
free_async(as);
|