Skip to content

device/dfu: fix transfer buffer overwrite issue - #3799

Open
HiFiPhile wants to merge 1 commit into
masterfrom
codex/dfu-buffer-fix
Open

device/dfu: fix transfer buffer overwrite issue#3799
HiFiPhile wants to merge 1 commit into
masterfrom
codex/dfu-buffer-fix

Conversation

@HiFiPhile

Copy link
Copy Markdown
Collaborator

No description provided.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR fixes a DFU device-mode data corruption scenario by ensuring DFU transfer payloads aren’t stored in EP0’s control buffer, which can be reused/overwritten by subsequent control transfers (notably GETSTATUS).

Changes:

  • Always use a dedicated aligned DFU transfer buffer (_transfer_buf) for DNLOAD/UPLOAD payloads.
  • Remove the conditional “use EP0 control buffer when large enough” helper to prevent buffer reuse across control requests.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread src/class/dfu/dfu_device.c Outdated
Signed-off-by: HiFiPhile <admin@hifiphile.com>
@HiFiPhile
HiFiPhile force-pushed the codex/dfu-buffer-fix branch from 338980c to 45775e9 Compare July 29, 2026 19:09
@claude

claude Bot commented Jul 29, 2026

Copy link
Copy Markdown
Contributor

Code review

No issues found. Checked for bugs and CLAUDE.md compliance.

@github-actions

Copy link
Copy Markdown

Size Difference Report

Because TinyUSB code size varies by port and configuration, the metrics below represent the averaged totals across all example builds.

Note: If there is no change, only one value is shown.

Changes >1% in size

file .text .rodata .data .bss size % diff
dfu_device.c 776 ➙ 752 (-24) 28 712 134 ➙ 181 (+47) 910 ➙ 933 (+23) +2.5%
TOTAL 776 ➙ 752 (-24) 28 712 134 ➙ 181 (+47) 910 ➙ 933 (+23) +2.5%
Changes <1% in size

No entries.

No changes
file .text .rodata .data .bss size % diff
audio_device.c 2885 0 1252 1621 4501 +0.0%
cdc_device.c 1235 16 1092 722 1955 +0.0%
cdc_host.c 6479 487 15 946 7639 +0.0%
dcd_ch32_usbfs.c 1698 0 0 1364 3062 +0.0%
dcd_ch32_usbhs.c 1922 0 0 481 2402 +0.0%
dcd_ci_fs.c 1955 0 0 1290 3245 +0.0%
dcd_ci_hs.c 1771 0 0 1344 2549 +0.0%
dcd_da146xx.c 3067 0 0 144 3211 +0.0%
dcd_dwc2.c 4229 19 0 265 4513 +0.0%
dcd_eptri.c 2273 0 0 259 2532 +0.0%
dcd_ft9xx.c 3284 0 0 172 3456 +0.0%
dcd_lpc17_40.c 1843 0 0 792 2239 +0.0%
dcd_lpc_ip3511.c 1538 0 0 264 1758 +0.0%
dcd_mm32f327x_otg.c 1478 0 0 1290 2768 +0.0%
dcd_msp430x5xx.c 1801 0 0 176 1977 +0.0%
dcd_musb.c 2666 0 0 179 2845 +0.0%
dcd_nrf5x.c 2974 0 0 292 3266 +0.0%
dcd_nuc120.c 1096 0 0 78 1174 +0.0%
dcd_nuc121.c 1170 0 0 101 1271 +0.0%
dcd_nuc505.c 0 0 1533 157 1690 +0.0%
dcd_rp2040.c 1004 0 764 653 2420 +0.0%
dcd_rusb2.c 3346 0 0 156 3502 +0.0%
dcd_samd.c 1071 0 0 266 1337 +0.0%
dcd_samg.c 1322 0 0 72 1394 +0.0%
dcd_stm32_fsdev.c 2568 0 0 291 2859 +0.0%
dfu_rt_device.c 157 0 134 0 157 +0.0%
dwc2_common.c 603 22 0 0 615 +0.0%
ecm_rndis_device.c 1067 0 1 2759 3826 +0.0%
ehci.c 2763 0 0 6274 7783 +0.0%
fsdev_common.c 182 0 0 0 182 +0.0%
hcd_ch32_usbfs.c 2491 0 0 502 2993 +0.0%
hcd_ci_fs.c 2466 0 0 469 2936 +0.0%
hcd_ci_hs.c 181 0 0 0 181 +0.0%
hcd_dwc2.c 5071 25 1 545 5642 +0.0%
hcd_musb.c 3071 0 0 157 3228 +0.0%
hcd_pio_usb.c 262 0 240 0 502 +0.0%
hcd_rp2040.c 1996 17 4 321 2338 +0.0%
hcd_rusb2.c 2951 0 0 245 3196 +0.0%
hcd_samd.c 2220 0 0 324 2544 +0.0%
hcd_stm32_fsdev.c 3248 0 1 420 3670 +0.0%
hid_device.c 1121 44 997 119 1240 +0.0%
hid_host.c 1247 0 0 1288 2534 +0.0%
hub.c 1385 8 8 30 1419 +0.0%
midi2_device.c 3001 34 1342 555 3569 +0.0%
midi2_host.c 1802 0 0 5921 7723 +0.0%
midi_device.c 1148 0 1007 614 1759 +0.0%
midi_host.c 1339 7 7 3538 4880 +0.0%
msc_device.c 2522 108 2293 802 3325 +0.0%
msc_host.c 1625 0 0 395 2020 +0.0%
mtp_device.c 1715 22 743 589 2312 +0.0%
ncm_device.c 1766 28 821 4393 6172 +0.0%
ohci.c 1925 0 0 2503 4428 +0.0%
printer_device.c 827 0 706 555 1380 +0.0%
rp2040_usb.c 386 35 632 11 1065 +0.0%
rusb2_common.c 160 0 16 0 176 +0.0%
tusb.c 449 0 389 3 451 +0.0%
tusb_fifo.c 855 0 486 0 850 +0.0%
typec_stm32.c 1230 8 2 19 1255 +0.0%
usbc.c 500 2 20 166 688 +0.0%
usbd.c 3611 57 90 354 4028 +0.0%
usbh.c 4979 57 81 1173 6256 +0.0%
usbtmc_device.c 2261 24 68 311 2604 +0.0%
vendor_device.c 1132 0 538 1561 2685 +0.0%
video_device.c 4446 5 1235 480 4919 +0.0%
TOTAL 124836 1025 16518 50771 177096 +0.0%

@github-actions

Copy link
Copy Markdown

Hardware-in-the-loop (HIL) Test Report

hfp-iar

✅ 40 passed · ❌ 16 failed · ⚪ 0 skipped · blank not run

Board usbtest cdc_msc_throughput audio_test_freertos cdc_dual_ports cdc_msc cdc_msc_freertos dfu dfu_runtime hid_boot_interface hid_generic_inout midi_test msc_dual_lun mtp printer_to_cdc duration
stm32l412nucleo 99s
stm32f746disco ✅ 30/30 ✅ C 13.7/14.4M M 25.8/31M 162s
stm32f746disco-DMA ❌ 0/30 ✅ C 13.5/12.8M M 24.3/32.4M 69s
lpcxpresso43s67 ✅ 30/30 ✅ C 11.4/11.3M M 33.6/30.5M 245s

hfp.json

✅ 24 passed · ❌ 32 failed · ⚪ 0 skipped · blank not run

Board usbtest cdc_msc_throughput audio_test_freertos cdc_dual_ports cdc_msc cdc_msc_freertos dfu dfu_runtime hid_boot_interface hid_generic_inout midi_test msc_dual_lun mtp printer_to_cdc duration
stm32l412nucleo 9s
stm32f746disco ❌ 0/30 ✅ C 13.7/12.6M M 25.2/30.7M 87s
stm32f746disco-DMA ❌ 0/30 ✅ C 14/12.2M M 25.5/31.1M 104s
lpcxpresso43s67 ❌ 0/30 168s

tinyusb-esp.json

✅ 18 passed · ❌ 6 failed · ⚪ 0 skipped · blank not run

Board usbtest msc_file_explorer_freertos audio_test_freertos cdc_msc_freertos device_info hid_composite_freertos duration
espressif_p4_function_ev ❌ 0/30 409 KB/s 269s
espressif_p4_function_ev-DMA ❌ 0/30 409 KB/s 259s
espressif_s3_devkitm ❌ 0/30 409 KB/s 278s
espressif_s3_devkitm-DMA ❌ 0/30 409 KB/s 274s

tinyusb.json

✅ 331 passed · ❌ 46 failed · ⚪ 19 skipped · blank not run

Board usbtest cdc_msc_throughput msc_file_explorer msc_file_explorer_freertos audio_test_freertos cdc_dual_ports cdc_msc cdc_msc_freertos cdc_msc_hid device_info dfu dfu_runtime hid_boot_interface hid_generic_inout host_info_to_device_cdc midi_test msc_dual_lun mtp printer_to_cdc duration
frdm_k64f 40s
ek_tm4c123gxl ❌ 0/30 ✅ C 516/552k M 545/539k 318s
metro_m4_express ❌ 0/30 ✅ C 507/511k M 511/513k 532s
raspberry_pi_pico_w 1103 KB/s 1022 KB/s 35s
feather_nrf52840_express ❌ 0/30 ✅ C 509/514k M 511/511k 401s
lpcxpresso11u37 ❌ 0/30 ✅ C 506/283k M 510/511k 555s
raspberry_pi_pico2 118s
max32666fthr ❌ 0/30 ✅ C 7/14.3M M 14.1/19.5M 425s
ra4m1_ek ❌ 0/30 ✅ C 664/417k M 623/616k 379s
stm32f072disco ❌ 0/30 ✅ C 509/256k M 510/482k 493s
raspberry_pi_pico ❌ 0/30 ✅ C 515/477k M 511/511k 411s
stm32f407disco ❌ 0/30 ✅ C 509/512k M 511/526k 493s
adafruit_fruit_jam ❌ 0/30 ✅ C 507/513k M 511/513k 62 KB/s 62 KB/s 392s
stm32f723disco ❌ 0/30 ✅ C 509/512k M 511/511k 16384 KB/s 4032 KB/s 622s
stm32f723disco-DMA ❌ 0/30 ✅ C 509/511k M 511/511k 17476 KB/s 4032 KB/s 439s
nanoch32v203-fsdev ❌ 0/30 ✅ C 610/624k M 618/535k 283s
nanoch32v203-usbfs ❌ 0/30 385s
stm32h743nucleo ❌ 0/30 ✅ C 530/569k M 546/545k 315s
stm32h743nucleo-DMA ❌ 0/30 ✅ C 509/520k M 511/537k 377s
ch32v103r_r1_1v0 ❌ 0/30 ✅ C 499/506k M 511/511k 452s
stm32g0b1nucleo ❌ 0/30 ✅ C 502/511k M 511/511k 413s
ch32v307v_r1_1v0-usbhs ❌ 0/30 ✅ C 7.1/7.7M M 23.2/15.2M 432s
ch32v307v_r1_1v0-usbfs ❌ 0/30 ✅ C 507/510k M 511/511k 313s
stm32l476disco ❌ 0/30 ✅ C 509/511k M 511/544k 393s
ch582m_evt ❌ 0/30 ✅ C 232/201k M 480/481k 328s
stm32u083nucleo ❌ 0/30 ✅ C 509/497k M 511/517k 307s
mimxrt1064_evk ❌ 0/30 ✅ C 24.7/18.7M M 36.7/35.1M 1368 KB/s 1365 KB/s 501s
nrf54lm20dk ❌ 0/30 ✅ C 1.9/4.1M M 7.2/8.1M 363s
ra6m5_ek ❌ 0/30 184s

@github-actions

Copy link
Copy Markdown

MemBrowse Memory Report

Top 10 targets by memory change (%) (out of 2503 targets) View Project Dashboard →

target .text .rodata .data .bss total % diff
mm32f327x_mb39/dfu 10,760 → 10,724 (-36) 2,136 → 2,648 (+512) 15,696 → 16,172 (+476) +3.0%
frdm_kl25z/dfu 12,780 → 12,736 (-44) 2,156 → 2,668 (+512) 17,268 → 17,736 (+468) +2.7%
frdm_k32l2a4s/dfu 14,252 → 14,208 (-44) 2,168 → 2,680 (+512) 18,740 → 19,208 (+468) +2.5%
frdm_mcxa153/dfu 15,712 → 15,676 (-36) 2,308 → 2,820 (+512) 21,392 → 21,868 (+476) +2.2%
lpcxpresso1769/dfu 10,960 → 10,924 (-36) 1,500 → 1,628 (+128) 13,096 → 13,188 (+92) +0.7%
lpcxpresso11u37/dfu 10,560 → 10,516 (-44) 11,048 → 11,004 (-44) -0.4%
lpcxpresso51u68/dfu 12,688 → 12,644 (-44) 12,828 → 12,784 (-44) -0.3%
lpcxpresso1347/dfu 10,228 → 10,192 (-36) 10,736 → 10,700 (-36) -0.3%
lpcxpresso1549/dfu 11,652 → 11,616 (-36) 12,240 → 12,204 (-36) -0.3%
frdm_k64f/dfu 13,784 → 13,748 (-36) 13,932 → 13,896 (-36) -0.3%

@AnthonyV-modretro

Copy link
Copy Markdown
Contributor

@hathach Wondering if this will make it into the next tinyusb release? We are stuck using an old version of tinyusb due to dfu not functioning correctly

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants