From 0232893611e7957626c210472f89fdf7fff95bcc Mon Sep 17 00:00:00 2001 From: Conor Patrick Date: Sat, 2 Mar 2019 19:38:03 -0500 Subject: [PATCH] increase buffer size for USB strings, check string length --- targets/stm32l432/lib/usbd/usbd_ctlreq.c | 6 +++++- targets/stm32l432/lib/usbd/usbd_ctlreq.h | 2 +- targets/stm32l432/lib/usbd/usbd_desc.c | 8 ++++---- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/targets/stm32l432/lib/usbd/usbd_ctlreq.c b/targets/stm32l432/lib/usbd/usbd_ctlreq.c index e40b242..c41e16d 100644 --- a/targets/stm32l432/lib/usbd/usbd_ctlreq.c +++ b/targets/stm32l432/lib/usbd/usbd_ctlreq.c @@ -821,12 +821,16 @@ void USBD_CtlError( USBD_HandleTypeDef *pdev , * @param len : descriptor length * @retval None */ -void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t *len) +void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t unicode_size, uint16_t *len) { uint8_t idx = 0U; if (desc != NULL) { + if ((idx + 4) >= unicode_size) + { + return; + } *len = (uint16_t)USBD_GetLen(desc) * 2U + 2U; unicode[idx++] = *(uint8_t *)(void *)len; unicode[idx++] = USB_DESC_TYPE_STRING; diff --git a/targets/stm32l432/lib/usbd/usbd_ctlreq.h b/targets/stm32l432/lib/usbd/usbd_ctlreq.h index 8eeebf8..db39abc 100644 --- a/targets/stm32l432/lib/usbd/usbd_ctlreq.h +++ b/targets/stm32l432/lib/usbd/usbd_ctlreq.h @@ -108,7 +108,7 @@ void USBD_CtlError (USBD_HandleTypeDef *pdev, USBD_SetupReqTypedef *req); void USBD_ParseSetupRequest (USBD_SetupReqTypedef *req, uint8_t *pdata); -void USBD_GetString (uint8_t *desc, uint8_t *unicode, uint16_t *len); +void USBD_GetString(uint8_t *desc, uint8_t *unicode, uint16_t unicode_size, uint16_t *len); /** * @} */ diff --git a/targets/stm32l432/lib/usbd/usbd_desc.c b/targets/stm32l432/lib/usbd/usbd_desc.c index 8bc1d83..eda83a0 100644 --- a/targets/stm32l432/lib/usbd/usbd_desc.c +++ b/targets/stm32l432/lib/usbd/usbd_desc.c @@ -108,7 +108,7 @@ const uint8_t USBD_LangIDDesc[USB_LEN_LANGID_STR_DESC]= HIBYTE(USBD_LANGID_STRING), }; -uint8_t USBD_StrDesc[32]; +uint8_t USBD_StrDesc[48]; /** * @brief Returns the device descriptor. @@ -142,7 +142,7 @@ uint8_t *USBD_HID_LangIDStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) */ uint8_t *USBD_HID_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) { - USBD_GetString((uint8_t *)USBD_PRODUCT_FS_STRING, USBD_StrDesc, length); + USBD_GetString((uint8_t *)USBD_PRODUCT_FS_STRING, USBD_StrDesc, sizeof(USBD_StrDesc), length); return USBD_StrDesc; } @@ -154,7 +154,7 @@ uint8_t *USBD_HID_ProductStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length */ uint8_t *USBD_HID_ManufacturerStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) { - USBD_GetString((uint8_t *)USBD_MANUFACTURER_STRING, USBD_StrDesc, length); + USBD_GetString((uint8_t *)USBD_MANUFACTURER_STRING, USBD_StrDesc, sizeof(USBD_StrDesc), length); return USBD_StrDesc; } @@ -192,6 +192,6 @@ uint8_t *USBD_HID_SerialStrDescriptor(USBD_SpeedTypeDef speed, uint16_t *length) } - USBD_GetString((uint8_t *)uuid_str, USBD_StrDesc, length); + USBD_GetString((uint8_t *)uuid_str, USBD_StrDesc, sizeof(USBD_StrDesc), length); return USBD_StrDesc; }