From 62da1411428ad1c3722ef56d1c8dbb81e766a6a8 Mon Sep 17 00:00:00 2001 From: Test User Date: Sun, 19 Apr 2026 19:22:46 +0800 Subject: [PATCH] fix: correct error type on timeout and prevent silent message loss on macOS 1. Fix incorrect JoinError type in Rule::join: when lookup times out after 5 retries, the code was returning VersionMismatch(0,0,0) instead of Timeout. 2. Fix silent message loss on macOS: when mach_msg_send fails with a non-retryable error and the remote is not dead, the code returned Ok(()) instead of Err(Error::Disconnect), causing the caller to incorrectly believe the message was sent. 3. Simplify bus controller buffer logic: the message_buffer_swap field was unnecessary since after mem::take, self.message_buffer is empty and can directly receive retained messages. Co-Authored-By: Claude Opus 4.7 --- ipmb/src/bus_controller.rs | 7 +------ ipmb/src/lib.rs | 2 +- ipmb/src/platform/macos/mod.rs | 2 +- 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/ipmb/src/bus_controller.rs b/ipmb/src/bus_controller.rs index e5eb1db..ac80116 100644 --- a/ipmb/src/bus_controller.rs +++ b/ipmb/src/bus_controller.rs @@ -21,7 +21,6 @@ pub struct BusController { sender: Sender, endpoints: Vec, message_buffer: Vec<(Instant, EncodedMessage)>, - message_buffer_swap: Vec<(Instant, EncodedMessage)>, io_hub: IoHub, last_detect_reachable: Instant, } @@ -41,7 +40,6 @@ impl BusController { sender, endpoints: Default::default(), message_buffer: Default::default(), - message_buffer_swap: Default::default(), io_hub, last_detect_reachable: Instant::now(), } @@ -81,13 +79,10 @@ impl BusController { let (remain, _) = self.handle_message(msg); if let Some(remain) = remain { if expire > now { - self.message_buffer_swap.push((expire, remain)); + self.message_buffer.push((expire, remain)); } } } - - self.message_buffer = message_buffer; - mem::swap(&mut self.message_buffer, &mut self.message_buffer_swap); } self.detect_reachable(now); diff --git a/ipmb/src/lib.rs b/ipmb/src/lib.rs index 4f17f2b..756a4d4 100644 --- a/ipmb/src/lib.rs +++ b/ipmb/src/lib.rs @@ -517,7 +517,7 @@ impl Rule { timeout_count += 1; if timeout_count > 5 { - return Err(JoinError::VersionMismatch(Version((0, 0, 0)))); + return Err(JoinError::Timeout); } wait!(); diff --git a/ipmb/src/platform/macos/mod.rs b/ipmb/src/platform/macos/mod.rs index 23874a3..77d194f 100644 --- a/ipmb/src/platform/macos/mod.rs +++ b/ipmb/src/platform/macos/mod.rs @@ -410,7 +410,7 @@ impl EncodedMessage { Err(Error::Disconnect) } else { log::error!("mach_msg failed: {r}"); - Ok(()) + Err(Error::Disconnect) }; } }