summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter D. Gray <peter@conalgo.com>2018-05-11 11:40:04 -0400
committerDamien George <damien.p.george@gmail.com>2018-05-14 12:08:34 +1000
commitca366454103e28d6a85823454e64c21302627555 (patch)
tree851e41d5aa20d289aa7a32b3a6ef84efb43ca0b4
parent1f1623d3b78edb9f824accb6c7da3c4872bdc1ef (diff)
stm32/usbd_hid_interface: Address possible race condition vs. interrupt.
The USB IRQ may fire once USBD_HID_ClearNAK() is called and then change the last_read_len value.
-rw-r--r--ports/stm32/usbd_hid_interface.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/ports/stm32/usbd_hid_interface.c b/ports/stm32/usbd_hid_interface.c
index 4ee533c21..9ab5986b6 100644
--- a/ports/stm32/usbd_hid_interface.c
+++ b/ports/stm32/usbd_hid_interface.c
@@ -94,12 +94,13 @@ int usbd_hid_rx(usbd_hid_itf_t *hid, size_t len, uint8_t *buf, uint32_t timeout)
}
// Copy bytes from device to user buffer
- memcpy(buf, hid->buffer[hid->current_read_buffer], hid->last_read_len);
+ int read_len = hid->last_read_len;
+ memcpy(buf, hid->buffer[hid->current_read_buffer], read_len);
hid->current_read_buffer = !hid->current_read_buffer;
// Clear NAK to indicate we are ready to read more data
USBD_HID_ClearNAK(hid->usbd);
// Success, return number of bytes read
- return hid->last_read_len;
+ return read_len;
}