usb-hub: limit chain length
USB supports up to 5 hubs chained. Catch attempts to chain more. Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
		
							parent
							
								
									4b7b2afae7
								
							
						
					
					
						commit
						c24e4aac3b
					
				
							
								
								
									
										1
									
								
								hw/usb.h
									
									
									
									
									
								
							
							
						
						
									
										1
									
								
								hw/usb.h
									
									
									
									
									
								
							@ -337,6 +337,7 @@ typedef struct USBPortOps {
 | 
				
			|||||||
struct USBPort {
 | 
					struct USBPort {
 | 
				
			||||||
    USBDevice *dev;
 | 
					    USBDevice *dev;
 | 
				
			||||||
    int speedmask;
 | 
					    int speedmask;
 | 
				
			||||||
 | 
					    int hubcount;
 | 
				
			||||||
    char path[16];
 | 
					    char path[16];
 | 
				
			||||||
    USBPortOps *ops;
 | 
					    USBPortOps *ops;
 | 
				
			||||||
    void *opaque;
 | 
					    void *opaque;
 | 
				
			||||||
 | 
				
			|||||||
@ -341,8 +341,10 @@ void usb_port_location(USBPort *downstream, USBPort *upstream, int portnr)
 | 
				
			|||||||
    if (upstream) {
 | 
					    if (upstream) {
 | 
				
			||||||
        snprintf(downstream->path, sizeof(downstream->path), "%s.%d",
 | 
					        snprintf(downstream->path, sizeof(downstream->path), "%s.%d",
 | 
				
			||||||
                 upstream->path, portnr);
 | 
					                 upstream->path, portnr);
 | 
				
			||||||
 | 
					        downstream->hubcount = upstream->hubcount + 1;
 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
        snprintf(downstream->path, sizeof(downstream->path), "%d", portnr);
 | 
					        snprintf(downstream->path, sizeof(downstream->path), "%d", portnr);
 | 
				
			||||||
 | 
					        downstream->hubcount = 0;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -25,6 +25,7 @@
 | 
				
			|||||||
#include "trace.h"
 | 
					#include "trace.h"
 | 
				
			||||||
#include "hw/usb.h"
 | 
					#include "hw/usb.h"
 | 
				
			||||||
#include "hw/usb/desc.h"
 | 
					#include "hw/usb/desc.h"
 | 
				
			||||||
 | 
					#include "qemu/error-report.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define NUM_PORTS 8
 | 
					#define NUM_PORTS 8
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -514,6 +515,11 @@ static int usb_hub_initfn(USBDevice *dev)
 | 
				
			|||||||
    USBHubPort *port;
 | 
					    USBHubPort *port;
 | 
				
			||||||
    int i;
 | 
					    int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (dev->port->hubcount == 5) {
 | 
				
			||||||
 | 
					        error_report("usb hub chain too deep");
 | 
				
			||||||
 | 
					        return -1;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    usb_desc_create_serial(dev);
 | 
					    usb_desc_create_serial(dev);
 | 
				
			||||||
    usb_desc_init(dev);
 | 
					    usb_desc_init(dev);
 | 
				
			||||||
    s->intr = usb_ep_get(dev, USB_TOKEN_IN, 1);
 | 
					    s->intr = usb_ep_get(dev, USB_TOKEN_IN, 1);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user