From 7eb033308a5033cc7759ede3da1132a8d1ff713c Mon Sep 17 00:00:00 2001 From: BigTreeTech <38851044+bigtreetech@users.noreply.github.com> Date: Wed, 28 Aug 2019 11:41:15 +0800 Subject: [PATCH 1/2] [bugfix] Restore overflowed memory copy --- STM32F1/cores/maple/libmaple/usb/usb_lib/usb_mem.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/STM32F1/cores/maple/libmaple/usb/usb_lib/usb_mem.c b/STM32F1/cores/maple/libmaple/usb/usb_lib/usb_mem.c index ad9740a18..d4ccafe73 100644 --- a/STM32F1/cores/maple/libmaple/usb/usb_lib/usb_mem.c +++ b/STM32F1/cores/maple/libmaple/usb/usb_lib/usb_mem.c @@ -62,12 +62,22 @@ void PMAToUserBufferCopy(u8 *pbUsrBuf, u16 wPMABufAddr, u16 wNBytes) u32 n = (wNBytes + 1) >> 1;/* /2*/ u32 i; u32 *pdwVal; + u8 *pbStartUsrBuf = pbUsrBuf; + u8 endVal; + if(wNBytes & 0x0001) + { + endVal = pbStartUsrBuf[wNBytes]; + } pdwVal = (u32 *)(wPMABufAddr * 2 + PMAAddr); for (i = n; i != 0; i--) { *(u16*)pbUsrBuf++ = *pdwVal++; pbUsrBuf++; } + if(wNBytes & 1) + { + pbStartUsrBuf[wNBytes] = endVal; + } } /******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/ From 1264166830d7fdc78a25d6e85092503809717522 Mon Sep 17 00:00:00 2001 From: stevstrong Date: Sat, 14 Sep 2019 19:32:15 +0200 Subject: [PATCH 2/2] Update usb_mem.c solves #661 --- .../maple/libmaple/usb/usb_lib/usb_mem.c | 21 ++++++------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/STM32F1/cores/maple/libmaple/usb/usb_lib/usb_mem.c b/STM32F1/cores/maple/libmaple/usb/usb_lib/usb_mem.c index d4ccafe73..113e7e1cd 100644 --- a/STM32F1/cores/maple/libmaple/usb/usb_lib/usb_mem.c +++ b/STM32F1/cores/maple/libmaple/usb/usb_lib/usb_mem.c @@ -59,24 +59,15 @@ void UserToPMABufferCopy(const u8 *pbUsrBuf, u16 wPMABufAddr, u16 wNBytes) *******************************************************************************/ void PMAToUserBufferCopy(u8 *pbUsrBuf, u16 wPMABufAddr, u16 wNBytes) { - u32 n = (wNBytes + 1) >> 1;/* /2*/ - u32 i; - u32 *pdwVal; - u8 *pbStartUsrBuf = pbUsrBuf; - u8 endVal; - if(wNBytes & 0x0001) + u16 * destPtr = (u16*)pbUsrBuf; + u32 * pdwVal = (u32 *)(wPMABufAddr * 2 + PMAAddr); + for (u16 i = wNBytes/2; i > 0; i--) { - endVal = pbStartUsrBuf[wNBytes]; + *destPtr++ = (u16)*pdwVal++; } - pdwVal = (u32 *)(wPMABufAddr * 2 + PMAAddr); - for (i = n; i != 0; i--) - { - *(u16*)pbUsrBuf++ = *pdwVal++; - pbUsrBuf++; - } - if(wNBytes & 1) + if (wNBytes & 0x1) // odd value ? { - pbStartUsrBuf[wNBytes] = endVal; + *(u8*)destPtr = *(u8*)pdwVal; } }