From feaeb533fb5963e9d603ccb5143662b21daed2d8 Mon Sep 17 00:00:00 2001 From: Dario Nieuwenhuis Date: Mon, 19 Dec 2022 01:15:32 +0100 Subject: [PATCH] hal-common/atomic_ring_buffer: fix crashes when len=0 --- embassy-hal-common/src/atomic_ring_buffer.rs | 24 ++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/embassy-hal-common/src/atomic_ring_buffer.rs b/embassy-hal-common/src/atomic_ring_buffer.rs index c5e444306..3e90b0870 100644 --- a/embassy-hal-common/src/atomic_ring_buffer.rs +++ b/embassy-hal-common/src/atomic_ring_buffer.rs @@ -82,10 +82,11 @@ impl RingBuffer { } pub fn is_full(&self) -> bool { + let len = self.len.load(Ordering::Relaxed); let start = self.start.load(Ordering::Relaxed); let end = self.end.load(Ordering::Relaxed); - self.wrap(end + 1) == start + len == 0 || self.wrap(end + 1) == start } pub fn is_empty(&self) -> bool { @@ -154,7 +155,7 @@ impl<'a> Writer<'a> { let end = self.0.end.load(Ordering::Relaxed); let n = if start <= end { - len - end - (start == 0) as usize + len - end - (start == 0 && len != 0) as usize } else { start - end - 1 }; @@ -328,4 +329,23 @@ mod tests { assert_eq!(rb.is_full(), true); } } + + #[test] + fn zero_len() { + let rb = RingBuffer::new(); + unsafe { + assert_eq!(rb.is_empty(), true); + assert_eq!(rb.is_full(), true); + + rb.writer().push(|buf| { + assert_eq!(0, buf.len()); + 0 + }); + + rb.reader().pop(|buf| { + assert_eq!(0, buf.len()); + 0 + }); + } + } }