usb: interface authorization: Introduces the default interface authorization
Interfaces are allowed per default. This can disabled or enabled (again) by writing 0 or 1 to /sys/bus/usb/devices/usbX/interface_authorized_default Signed-off-by: Stefan Koch <stefan.koch10@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Родитель
4ad2ddce1a
Коммит
6b2bd3c8c6
|
@ -882,9 +882,53 @@ static ssize_t authorized_default_store(struct device *dev,
|
|||
}
|
||||
static DEVICE_ATTR_RW(authorized_default);
|
||||
|
||||
/*
|
||||
* interface_authorized_default_show - show default authorization status
|
||||
* for USB interfaces
|
||||
*
|
||||
* note: interface_authorized_default is the default value
|
||||
* for initializing the authorized attribute of interfaces
|
||||
*/
|
||||
static ssize_t interface_authorized_default_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct usb_device *usb_dev = to_usb_device(dev);
|
||||
struct usb_hcd *hcd = bus_to_hcd(usb_dev->bus);
|
||||
|
||||
return sprintf(buf, "%u\n", !!HCD_INTF_AUTHORIZED(hcd));
|
||||
}
|
||||
|
||||
/*
|
||||
* interface_authorized_default_store - store default authorization status
|
||||
* for USB interfaces
|
||||
*
|
||||
* note: interface_authorized_default is the default value
|
||||
* for initializing the authorized attribute of interfaces
|
||||
*/
|
||||
static ssize_t interface_authorized_default_store(struct device *dev,
|
||||
struct device_attribute *attr, const char *buf, size_t count)
|
||||
{
|
||||
struct usb_device *usb_dev = to_usb_device(dev);
|
||||
struct usb_hcd *hcd = bus_to_hcd(usb_dev->bus);
|
||||
int rc = count;
|
||||
bool val;
|
||||
|
||||
if (strtobool(buf, &val) != 0)
|
||||
return -EINVAL;
|
||||
|
||||
if (val)
|
||||
set_bit(HCD_FLAG_INTF_AUTHORIZED, &hcd->flags);
|
||||
else
|
||||
clear_bit(HCD_FLAG_INTF_AUTHORIZED, &hcd->flags);
|
||||
|
||||
return rc;
|
||||
}
|
||||
static DEVICE_ATTR_RW(interface_authorized_default);
|
||||
|
||||
/* Group all the USB bus attributes */
|
||||
static struct attribute *usb_bus_attrs[] = {
|
||||
&dev_attr_authorized_default.attr,
|
||||
&dev_attr_interface_authorized_default.attr,
|
||||
NULL,
|
||||
};
|
||||
|
||||
|
@ -2682,6 +2726,9 @@ int usb_add_hcd(struct usb_hcd *hcd,
|
|||
hcd->authorized_default = authorized_default;
|
||||
set_bit(HCD_FLAG_HW_ACCESSIBLE, &hcd->flags);
|
||||
|
||||
/* per default all interfaces are authorized */
|
||||
set_bit(HCD_FLAG_INTF_AUTHORIZED, &hcd->flags);
|
||||
|
||||
/* HC is in reset state, but accessible. Now do the one-time init,
|
||||
* bottom up so that hcds can customize the root hubs before hub_wq
|
||||
* starts talking to them. (Note, bus id is assigned early too.)
|
||||
|
|
|
@ -1807,6 +1807,7 @@ free_interfaces:
|
|||
intfc = cp->intf_cache[i];
|
||||
intf->altsetting = intfc->altsetting;
|
||||
intf->num_altsetting = intfc->num_altsetting;
|
||||
intf->authorized = !!HCD_INTF_AUTHORIZED(hcd);
|
||||
kref_get(&intfc->ref);
|
||||
|
||||
alt = usb_altnum_to_altsetting(intf, 0);
|
||||
|
|
|
@ -120,6 +120,7 @@ struct usb_hcd {
|
|||
#define HCD_FLAG_WAKEUP_PENDING 4 /* root hub is resuming? */
|
||||
#define HCD_FLAG_RH_RUNNING 5 /* root hub is running? */
|
||||
#define HCD_FLAG_DEAD 6 /* controller has died? */
|
||||
#define HCD_FLAG_INTF_AUTHORIZED 7 /* authorize interfaces? */
|
||||
|
||||
/* The flags can be tested using these macros; they are likely to
|
||||
* be slightly faster than test_bit().
|
||||
|
@ -131,6 +132,14 @@ struct usb_hcd {
|
|||
#define HCD_RH_RUNNING(hcd) ((hcd)->flags & (1U << HCD_FLAG_RH_RUNNING))
|
||||
#define HCD_DEAD(hcd) ((hcd)->flags & (1U << HCD_FLAG_DEAD))
|
||||
|
||||
/*
|
||||
* Specifies if interfaces are authorized by default
|
||||
* or they require explicit user space authorization; this bit is
|
||||
* settable through /sys/class/usb_host/X/interface_authorized_default
|
||||
*/
|
||||
#define HCD_INTF_AUTHORIZED(hcd) \
|
||||
((hcd)->flags & (1U << HCD_FLAG_INTF_AUTHORIZED))
|
||||
|
||||
/* Flags that get set only during HCD registration or removal. */
|
||||
unsigned rh_registered:1;/* is root hub registered? */
|
||||
unsigned rh_pollable:1; /* may we poll the root hub? */
|
||||
|
|
Загрузка…
Ссылка в новой задаче