diff options
author | Hans de Goede <hdegoede@redhat.com> | 2012-02-12 15:51:41 +0100 |
---|---|---|
committer | Hans de Goede <hdegoede@redhat.com> | 2012-02-14 18:56:08 +0100 |
commit | f12ed95d1721918d05ff1f7cdb9293aabe7e0588 (patch) | |
tree | c69a877cdc93fe7a0b216a72fd0aeda5eea2b3a1 /usbredirhost/usbredirhost.c | |
parent | df5b37a3c3409a8d686fecbb8cee1d84e357f8d3 (diff) |
usbredirhost: Better locking for interrupt receiving handling
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Diffstat (limited to 'usbredirhost/usbredirhost.c')
-rw-r--r-- | usbredirhost/usbredirhost.c | 20 |
1 files changed, 10 insertions, 10 deletions
diff --git a/usbredirhost/usbredirhost.c b/usbredirhost/usbredirhost.c index 6bd28ea..0801d4d 100644 --- a/usbredirhost/usbredirhost.c +++ b/usbredirhost/usbredirhost.c @@ -1531,27 +1531,27 @@ static void usbredirhost_start_interrupt_receiving(void *priv, uint32_t id, uint8_t ep = start_interrupt_receiving->endpoint; int status; + LOCK(host); + if (host->disconnected) { - usbredirhost_send_interrupt_recv_status(host, id, ep, - usb_redir_ioerror); - FLUSH(host); - return; + status = usb_redir_ioerror; + goto leave; } if (host->endpoint[EP2I(ep)].interrupt_in_transfer) { ERROR("received interrupt start for already active ep %02X", ep); - usbredirhost_send_interrupt_recv_status(host, id, ep, usb_redir_inval); - FLUSH(host); - return; + status = usb_redir_inval; + goto leave; } status = usbredirhost_alloc_interrupt_in_transfer(host, ep); if (status != usb_redir_success) { - usbredirhost_send_interrupt_recv_status(host, id, ep, usb_redir_stall); - FLUSH(host); - return; + status = usb_redir_stall; + goto leave; } status = usbredirhost_submit_interrupt_in_transfer(host, ep); +leave: + UNLOCK(host); usbredirhost_send_interrupt_recv_status(host, id, ep, status); FLUSH(host); } |