From 186c72eefd079f07e84c51883adef357ed1f2d39 Mon Sep 17 00:00:00 2001 From: "Young, Nathen C" Date: Wed, 9 Sep 2026 08:57:09 -0700 Subject: [PATCH] fix(usb): terminate packet-aligned CDC transfers with ZLP Send a synchronous zero-length packet after CDC responses whose length is an exact multiple of the endpoint packet size, preventing oversized host reads from remaining pending. --- common_arm/usb/usb_cdc_at32.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/common_arm/usb/usb_cdc_at32.c b/common_arm/usb/usb_cdc_at32.c index f4a6087c2..2c6b7d4b8 100644 --- a/common_arm/usb/usb_cdc_at32.c +++ b/common_arm/usb/usb_cdc_at32.c @@ -508,6 +508,21 @@ int usb_write(const uint8_t *data, const size_t len) { // Have a cup of tea? } + // End a packet-aligned CDC transfer with a zero-length packet. Without + // this short packet, a host read larger than this reply can remain pending. + // Use the low-level sender: usb_write() intentionally rejects len == 0. + // Keep this in the synchronous path, not the asynchronous sample stream. + if ((len % USBD_CDC_IN_MAXPACKET_SIZE) == 0) { + if (usb_vcp_send_data(udev, (uint8_t *) data, 0) != SUCCESS) { + return PM3_EIO; + } + while (pcdc->g_tx_completed != 1) { + if (usb_check() == false) { + return PM3_EIO; + } + } + } + return PM3_SUCCESS; }