diff options
author | Hans de Goede <hdegoede@redhat.com> | 2011-02-02 17:46:00 +0100 |
---|---|---|
committer | Gerd Hoffmann <kraxel@redhat.com> | 2011-05-04 12:25:52 +0200 |
commit | 19f3322379c25a235eb1ec6335676549109fa625 (patch) | |
tree | d833d9d4e6e0d8f0cd7bbb9e57a554ed1c7d1e1a /hw/usb.c | |
parent | bb6d5498c6756eba3d0779c7753fc8830a8a9078 (diff) |
usb: control buffer fixes
Windows allows control transfers to pass up to 4k of data, so raise our
control buffer size to 4k. For control out transfers the usb core code copies
the control request data to a buffer before calling the device's handle_control
callback. Add a check for overflowing the buffer before copying the data.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Diffstat (limited to 'hw/usb.c')
-rw-r--r-- | hw/usb.c | 6 |
1 files changed, 6 insertions, 0 deletions
@@ -93,6 +93,12 @@ static int do_token_setup(USBDevice *s, USBPacket *p) s->setup_len = ret; s->setup_state = SETUP_STATE_DATA; } else { + if (s->setup_len > sizeof(s->data_buf)) { + fprintf(stderr, + "usb_generic_handle_packet: ctrl buffer too small (%d > %zu)\n", + s->setup_len, sizeof(s->data_buf)); + return USB_RET_STALL; + } if (s->setup_len == 0) s->setup_state = SETUP_STATE_ACK; else |