Commit c24e4aac authored by Gerd Hoffmann's avatar Gerd Hoffmann
Browse files

usb-hub: limit chain length



USB supports up to 5 hubs chained.
Catch attempts to chain more.

Signed-off-by: default avatarGerd Hoffmann <kraxel@redhat.com>
parent 4b7b2afa
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -337,6 +337,7 @@ typedef struct USBPortOps {
struct USBPort {
    USBDevice *dev;
    int speedmask;
    int hubcount;
    char path[16];
    USBPortOps *ops;
    void *opaque;
+2 −0
Original line number Diff line number Diff line
@@ -341,8 +341,10 @@ void usb_port_location(USBPort *downstream, USBPort *upstream, int portnr)
    if (upstream) {
        snprintf(downstream->path, sizeof(downstream->path), "%s.%d",
                 upstream->path, portnr);
        downstream->hubcount = upstream->hubcount + 1;
    } else {
        snprintf(downstream->path, sizeof(downstream->path), "%d", portnr);
        downstream->hubcount = 0;
    }
}

+6 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@
#include "trace.h"
#include "hw/usb.h"
#include "hw/usb/desc.h"
#include "qemu/error-report.h"

#define NUM_PORTS 8

@@ -514,6 +515,11 @@ static int usb_hub_initfn(USBDevice *dev)
    USBHubPort *port;
    int i;

    if (dev->port->hubcount == 5) {
        error_report("usb hub chain too deep");
        return -1;
    }

    usb_desc_create_serial(dev);
    usb_desc_init(dev);
    s->intr = usb_ep_get(dev, USB_TOKEN_IN, 1);