Hi

On Sun, Oct 4, 2026 at 4:11 PM Junjie Cao <[email protected]> wrote:
>
> From: Junjie Cao <[email protected]>
>
> usb_host_ep_update() returns before freeing the active configuration
> descriptor when an endpoint address is invalid or duplicated.
> usb_host_claim_interfaces() also returns without freeing it when fewer
> interfaces can be claimed than the descriptor declares. Each failure
> leaves one descriptor allocated.
>
> Fixes: 2b2325ff64 ("use libusb for usb-host")
> Cc: [email protected]
> Signed-off-by: Junjie Cao <[email protected]>

Reviewed-by: Marc-André Lureau <[email protected]>

Although it's an opportunity to introduce g_auto support:
typedef struct libusb_config_descriptor libusb_config_descriptor;
G_DEFINE_AUTOPTR_CLEANUP_FUNC(libusb_config_descriptor,
                              libusb_free_config_descriptor)

Then declaration should become:
g_autoptr(libusb_config_descriptor) conf = NULL;

And we can drop free paths. Up to you if you want to make a v2


> ---
>  hw/usb/host-libusb.c | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)
>
> diff --git a/hw/usb/host-libusb.c b/hw/usb/host-libusb.c
> index fd4a16ee8a..491302feb7 100644
> --- a/hw/usb/host-libusb.c
> +++ b/hw/usb/host-libusb.c
> @@ -921,12 +921,12 @@ static void usb_host_ep_update(USBHostDevice *s)
>              if (ep == 0) {
>                  trace_usb_host_parse_error(s->bus_num, s->addr,
>                                             "invalid endpoint address");
> -                return;
> +                goto out;
>              }
>              if (usb_ep_get_type(udev, pid, ep) != USB_ENDPOINT_XFER_INVALID) 
> {
>                  trace_usb_host_parse_error(s->bus_num, s->addr,
>                                             "duplicate endpoint address");
> -                return;
> +                goto out;
>              }
>
>              trace_usb_host_parse_endpoint(s->bus_num, s->addr, ep,
> @@ -949,6 +949,7 @@ static void usb_host_ep_update(USBHostDevice *s)
>          }
>      }
>
> +out:
>      libusb_free_config_descriptor(conf);
>  }
>
> @@ -1375,6 +1376,7 @@ static int usb_host_claim_interfaces(USBHostDevice *s, 
> int configuration)
>          }
>      }
>      if (claimed != conf->bNumInterfaces) {
> +        libusb_free_config_descriptor(conf);
>          return USB_RET_STALL;
>      }
>
> --
> 2.43.0
>
>


-- 
Marc-André Lureau

Reply via email to