Skip to content

Commit 9e86580

Browse files
poornadharshan13-rgbroma-jam
authored andcommitted
fix(dcd_dwc2): Incorrect handling of ZLP for OUT transfer
1 parent 461d10a commit 9e86580

File tree

2 files changed

+28
-12
lines changed

2 files changed

+28
-12
lines changed

src/common/tusb_common.h

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -109,20 +109,35 @@ extern void* tusb_app_phys_to_virt(void *phys_addr);
109109

110110
// This is a backport of memset_s from c11
111111
TU_ATTR_ALWAYS_INLINE static inline int tu_memset_s(void *dest, size_t destsz, int ch, size_t count) {
112-
// TODO may check if desst and src is not NULL
113-
if ( count > destsz ) {
112+
// Validate parameters
113+
if (dest == NULL) {
114114
return -1;
115115
}
116+
117+
if (count > destsz) {
118+
return -1;
119+
}
120+
116121
memset(dest, ch, count);
117122
return 0;
118123
}
119124

120125
// This is a backport of memcpy_s from c11
121126
TU_ATTR_ALWAYS_INLINE static inline int tu_memcpy_s(void *dest, size_t destsz, const void *src, size_t count) {
122-
// TODO may check if desst and src is not NULL
123-
if ( count > destsz ) {
127+
// Validate parameters
128+
if (dest == NULL) {
124129
return -1;
125130
}
131+
132+
// For memcpy, src may be NULL only if count == 0. Reject otherwise.
133+
if (src == NULL && count != 0) {
134+
return -1;
135+
}
136+
137+
if (count > destsz) {
138+
return -1;
139+
}
140+
126141
memcpy(dest, src, count);
127142
return 0;
128143
}

src/portable/synopsys/dwc2/dcd_dwc2.c

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -805,17 +805,18 @@ static void handle_rxflvl_irq(uint8_t rhport) {
805805
dfifo_read_packet(dwc2, xfer->buffer, byte_count);
806806
xfer->buffer += byte_count;
807807
}
808+
}
808809

809-
// short packet, minus remaining bytes (xfer_size)
810-
if (byte_count < xfer->max_size) {
811-
const dwc2_ep_tsize_t tsiz = {.value = epout->tsiz};
812-
xfer->total_len -= tsiz.xfer_size;
813-
if (epnum == 0) {
814-
xfer->total_len -= _dcd_data.ep0_pending[TUSB_DIR_OUT];
815-
_dcd_data.ep0_pending[TUSB_DIR_OUT] = 0;
816-
}
810+
// short packet (including ZLP when byte_count == 0), minus remaining bytes (xfer_size)
811+
if (byte_count < xfer->max_size) {
812+
const dwc2_ep_tsize_t tsiz = {.value = epout->tsiz};
813+
xfer->total_len -= tsiz.xfer_size;
814+
if (epnum == 0) {
815+
xfer->total_len -= _dcd_data.ep0_pending[TUSB_DIR_OUT];
816+
_dcd_data.ep0_pending[TUSB_DIR_OUT] = 0;
817817
}
818818
}
819+
819820
break;
820821
}
821822

0 commit comments

Comments
 (0)