Re: [PATCH v2] usbip: dynamically allocate idev by nports found in sysfs

From: Shuah Khan
Date: Tue May 22 2018 - 18:02:35 EST


On 05/22/2018 11:04 AM, Michael Grzeschik wrote:
> As the amount of available ports varies by the kernels build
> configuration. To remove the limitation of the fixed 128 ports
> we allocate the amount of idevs by using the number we get
> from the kernel.
>
> Signed-off-by: Michael Grzeschik <m.grzeschik@xxxxxxxxxxxxxx>
> ---
> v1 -> v2: - reworked memory allocation into one calloc call
> - added error path on allocation failure
>
> tools/usb/usbip/libsrc/vhci_driver.c | 14 +++++++++-----
> tools/usb/usbip/libsrc/vhci_driver.h | 3 +--
> 2 files changed, 10 insertions(+), 7 deletions(-)
>
> diff --git a/tools/usb/usbip/libsrc/vhci_driver.c b/tools/usb/usbip/libsrc/vhci_driver.c
> index c9c81614a66ad..6e2a9edfd1f0d 100644
> --- a/tools/usb/usbip/libsrc/vhci_driver.c
> +++ b/tools/usb/usbip/libsrc/vhci_driver.c
> @@ -242,13 +242,20 @@ static int read_record(int rhport, char *host, unsigned long host_len,
>
> int usbip_vhci_driver_open(void)
> {
> + int nports = get_nports();
>

I missed this error leg in my previous comments. get_nports() could return
errorwhich is -1.

> udev_context = udev_new();
> if (!udev_context) {
> err("udev_new failed");
> return -1;
> }
>
> - vhci_driver = calloc(1, sizeof(struct usbip_vhci_driver));
> + vhci_driver = calloc(1, sizeof(struct usbip_vhci_driver) +
> + nports * sizeof(struct usbip_imported_device));

nports could be -1 at this point.

> + if (!vhci_driver) {
> + err("vhci_driver allocation failed");
> + return -1;
> + }
>
> /* will be freed in usbip_driver_close() */
> vhci_driver->hc_device =
> @@ -260,15 +267,12 @@ int usbip_vhci_driver_open(void)
> goto err;
> }
>
> - vhci_driver->nports = get_nports();
> + vhci_driver->nports = nports;
> dbg("available ports: %d", vhci_driver->nports);
>
> if (vhci_driver->nports <= 0) {
> err("no available ports");
> goto err;
This check should move up along with the get_nports() call.

> - } else if (vhci_driver->nports > MAXNPORT) {
> - err("port number exceeds %d", MAXNPORT);
> - goto err;
> }
>
> vhci_driver->ncontrollers = get_ncontrollers();
> diff --git a/tools/usb/usbip/libsrc/vhci_driver.h b/tools/usb/usbip/libsrc/vhci_driver.h
> index 418b404d51210..6c9aca2167051 100644
> --- a/tools/usb/usbip/libsrc/vhci_driver.h
> +++ b/tools/usb/usbip/libsrc/vhci_driver.h
> @@ -13,7 +13,6 @@
>
> #define USBIP_VHCI_BUS_TYPE "platform"
> #define USBIP_VHCI_DEVICE_NAME "vhci_hcd.0"
> -#define MAXNPORT 128
>
> enum hub_speed {
> HUB_SPEED_HIGH = 0,
> @@ -41,7 +40,7 @@ struct usbip_vhci_driver {
>
> int ncontrollers;
> int nports;
> - struct usbip_imported_device idev[MAXNPORT];
> + struct usbip_imported_device idev[];
> };
>
>
>

thanks,
-- Shuah