On Thu, Jul 30, 2015 at 08:19:19AM +0200, Stefan Koch wrote:
> 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 <[email protected]>
> ---
> drivers/usb/core/hcd.c | 47
> ++++++++++++++++++++++++++++++++++++++++++++++
> drivers/usb/core/message.c | 1 +
> include/linux/usb/hcd.h | 3 +++
> 3 files changed, 51 insertions(+)
>
> diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
> index cbcd092..84b5923 100644
> --- a/drivers/usb/core/hcd.c
> +++ b/drivers/usb/core/hcd.c
> @@ -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.)
> diff --git a/drivers/usb/core/message.c b/drivers/usb/core/message.c
> index f368d20..3d25d89 100644
> --- a/drivers/usb/core/message.c
> +++ b/drivers/usb/core/message.c
> @@ -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);
> diff --git a/include/linux/usb/hcd.h b/include/linux/usb/hcd.h
> index c9aa779..7b8ddae 100644
> --- a/include/linux/usb/hcd.h
> +++ b/include/linux/usb/hcd.h
> @@ -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 8 /* authorize interfaces? */
Again, what happened to this being '7'? Don't skip bits for no reason.
thanks,
greg k-h
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html