Hi,

On Tue, Sep 16, 2014 at 11:38:40PM +0000, Maximilian Eschenbacher wrote:
> From: Dominik Paulus <[email protected]>
> 
> This patch adds the possibility to stored ACLs for allowed clients for
> each stub device in sysfs. It adds a new sysfs entry called "usbip_acl"
> for each stub device, containing a list of CIDR masks of allowed
> clients. This file will be used by usbip and usbipd to store the ACL.

Is there a need to involve the kernel here, couldn't usbip and usbipd
apply the ACLs during connection setup in userspace?

> Signed-off-by: Maximilian Eschenbacher <[email protected]>
> Signed-off-by: Fjodor Schelichow <[email protected]>
> Signed-off-by: Johannes Stadlinger <[email protected]>
> Signed-off-by: Kurt Kanzenbach <[email protected]>
> Signed-off-by: Dominik Paulus <[email protected]>
> Signed-off-by: Tobias Polzer <[email protected]>
> ---
>  drivers/usb/usbip/stub.h     |  5 ++++
>  drivers/usb/usbip/stub_dev.c | 60 
> +++++++++++++++++++++++++++++++++++++++++++-
>  2 files changed, 64 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/usb/usbip/stub.h b/drivers/usb/usbip/stub.h
> index 266e2b0..b2d3d55 100644
> --- a/drivers/usb/usbip/stub.h
> +++ b/drivers/usb/usbip/stub.h
> @@ -60,6 +60,11 @@ struct stub_device {
>       struct list_head unlink_free;
>  
>       wait_queue_head_t tx_waitq;
> +
> +     /* list of allowed IP addrs */
> +     char *acls;
> +     /* for locking list operations */
> +     spinlock_t ip_lock;

Perhaps name this 'acl_lock' to make more obvious what it covers?

>  };
>  
>  /* private data into urb->priv */
> diff --git a/drivers/usb/usbip/stub_dev.c b/drivers/usb/usbip/stub_dev.c
> index fac20e0..e6624f1 100644
> --- a/drivers/usb/usbip/stub_dev.c
> +++ b/drivers/usb/usbip/stub_dev.c
> @@ -119,6 +119,55 @@ err:
>  }
>  static DEVICE_ATTR(usbip_sockfd, S_IWUSR, NULL, store_sockfd);
>  
> +/*
> + * This function replaces the current ACL list
> + */
> +static ssize_t store_acl(struct device *dev, struct device_attribute *attr,
> +                     const char *buf, size_t count)
> +{
> +     struct stub_device *sdev = dev_get_drvdata(dev);
> +     int retval;
> +
> +     if (count >= PAGE_SIZE)
> +             return -EINVAL;
> +
> +     spin_lock_irq(&sdev->ip_lock);
> +     kfree(sdev->acls);
> +     sdev->acls = kstrdup(buf, GFP_KERNEL);
> +     if (!sdev->acls)
> +             retval = -ENOMEM;
> +     else
> +             retval = strlen(sdev->acls);
> +     spin_unlock_irq(&sdev->ip_lock);
> +
> +     return retval;
> +}
> +
> +/*
> + * This functions prints all allowed IP addrs for this dev
> + */
> +static ssize_t show_acl(struct device *dev, struct device_attribute *attr,
> +                    char *buf)
> +{
> +     struct stub_device *sdev = dev_get_drvdata(dev);
> +     int retval = 0;
> +
> +     if (!sdev)
> +             return -ENODEV;
> +
> +     spin_lock_irq(&sdev->ip_lock);
> +     if (sdev->acls == NULL) {
> +             retval = 0;
> +     } else {
> +             strcpy(buf, sdev->acls);
> +             retval = strlen(buf);
> +     }
> +     spin_unlock_irq(&sdev->ip_lock);
> +
> +     return retval;
> +}
> +static DEVICE_ATTR(usbip_acl, S_IWUSR | S_IRUGO, show_acl, store_acl);
> +
>  static int stub_add_files(struct device *dev)
>  {
>       int err = 0;
> @@ -134,9 +183,13 @@ static int stub_add_files(struct device *dev)
>       err = device_create_file(dev, &dev_attr_usbip_debug);
>       if (err)
>               goto err_debug;
> +     err = device_create_file(dev, &dev_attr_usbip_acl);
> +     if (err)
> +             goto err_ip;
>  
>       return 0;
> -
> +err_ip:
> +     device_remove_file(dev, &dev_attr_usbip_debug);
>  err_debug:
>       device_remove_file(dev, &dev_attr_usbip_sockfd);
>  err_sockfd:
> @@ -150,6 +203,7 @@ static void stub_remove_files(struct device *dev)
>       device_remove_file(dev, &dev_attr_usbip_status);
>       device_remove_file(dev, &dev_attr_usbip_sockfd);
>       device_remove_file(dev, &dev_attr_usbip_debug);
> +     device_remove_file(dev, &dev_attr_usbip_acl);
>  }
>  
>  static void stub_shutdown_connection(struct usbip_device *ud)
> @@ -287,6 +341,7 @@ static struct stub_device *stub_device_alloc(struct 
> usb_device *udev)
>       INIT_LIST_HEAD(&sdev->priv_free);
>       INIT_LIST_HEAD(&sdev->unlink_free);
>       INIT_LIST_HEAD(&sdev->unlink_tx);
> +     spin_lock_init(&sdev->ip_lock);
>       spin_lock_init(&sdev->priv_lock);
>  
>       init_waitqueue_head(&sdev->tx_waitq);
> @@ -453,6 +508,9 @@ static void stub_disconnect(struct usb_device *udev)
>  
>       usb_put_dev(sdev->udev);
>  
> +     /* free ACL list */
> +     kfree(sdev->acls);
> +
>       /* free sdev */
>       busid_priv->sdev = NULL;
>       stub_device_free(sdev);

Otherwise looks good to me.

        Max
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to