From 5645d44127ec5557da907f7784698c64414e4834 Mon Sep 17 00:00:00 2001 From: "William D. Jones" Date: Thu, 7 Feb 2019 21:25:27 -0500 Subject: [PATCH] stm32f4: Add for-loop guard for transmit_packet xfers < 4 chars. --- src/portable/stm/stm32f4/dcd_stm32f4.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/portable/stm/stm32f4/dcd_stm32f4.c b/src/portable/stm/stm32f4/dcd_stm32f4.c index e71d8e268..034e6c4fa 100644 --- a/src/portable/stm/stm32f4/dcd_stm32f4.c +++ b/src/portable/stm/stm32f4/dcd_stm32f4.c @@ -428,9 +428,15 @@ static void transmit_packet(xfer_ctl_t * xfer, USB_OTG_INEndpointTypeDef * in_ep // Buffer might not be aligned to 32b, so we need to force alignment // by copying to a temp var. uint8_t * base = (xfer->buffer + xfer->queued_len); - for(uint16_t i = 0; i < to_xfer_size_aligned; i += 4) { - uint32_t tmp = base[i] | (base[i + 1] << 8) | (base[i + 2] << 16) | (base[i + 3] << 24); - (* tx_fifo) = tmp; + + // This for loop always runs at least once- skip if less than 4 bytes + // to send off. + if(to_xfer_size >= 4) { + for(uint16_t i = 0; i < to_xfer_size_aligned; i += 4) { + uint32_t tmp = base[i] | (base[i + 1] << 8) | \ + (base[i + 2] << 16) | (base[i + 3] << 24); + (* tx_fifo) = tmp; + } } // Do not read beyond end of buffer if not divisible by 4.