diff options
| -rw-r--r-- | embassy-usb/CHANGELOG.md | 1 | ||||
| -rw-r--r-- | embassy-usb/src/class/cdc_acm.rs | 7 |
2 files changed, 6 insertions, 2 deletions
diff --git a/embassy-usb/CHANGELOG.md b/embassy-usb/CHANGELOG.md index 3dd71ffbc..f90875166 100644 --- a/embassy-usb/CHANGELOG.md +++ b/embassy-usb/CHANGELOG.md | |||
| @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | |||
| 10 | 10 | ||
| 11 | - Add support for USB HID Boot Protocol Mode | 11 | - Add support for USB HID Boot Protocol Mode |
| 12 | - Bump usbd-hid from 0.8.1 to 0.9.0 | 12 | - Bump usbd-hid from 0.8.1 to 0.9.0 |
| 13 | - Fix a bug where CDC ACM BufferedReceiver repeats data when its future is dropped | ||
| 13 | 14 | ||
| 14 | ## 0.5.1 - 2025-08-26 | 15 | ## 0.5.1 - 2025-08-26 |
| 15 | 16 | ||
diff --git a/embassy-usb/src/class/cdc_acm.rs b/embassy-usb/src/class/cdc_acm.rs index 388e21fbd..c990b679e 100644 --- a/embassy-usb/src/class/cdc_acm.rs +++ b/embassy-usb/src/class/cdc_acm.rs | |||
| @@ -545,9 +545,12 @@ impl<'d, D: Driver<'d>> embedded_io_async::Read for BufferedReceiver<'d, D> { | |||
| 545 | return self.receiver.read_packet(buf).await; | 545 | return self.receiver.read_packet(buf).await; |
| 546 | } | 546 | } |
| 547 | 547 | ||
| 548 | // Otherwise read a packet into the internal buffer, and return some of it to the caller | 548 | // Otherwise read a packet into the internal buffer, and return some of it to the caller. |
| 549 | self.start = 0; | 549 | // |
| 550 | // It's important that `start` and `end` be updated in this order so they're left in a | ||
| 551 | // consistent state if the `read` future is dropped mid-execution, e.g. from a timeout. | ||
| 550 | self.end = self.receiver.read_packet(&mut self.buffer).await?; | 552 | self.end = self.receiver.read_packet(&mut self.buffer).await?; |
| 553 | self.start = 0; | ||
| 551 | return Ok(self.read_from_buffer(buf)); | 554 | return Ok(self.read_from_buffer(buf)); |
| 552 | } | 555 | } |
| 553 | } | 556 | } |
