From fd1a1de72480f860374cc839be165e4a03689107 Mon Sep 17 00:00:00 2001 From: Abderahmane BENALI Date: Tue, 2 Jun 2026 17:41:00 +0200 Subject: [PATCH] fix: accumulate rmw_wait timeout in int64 so RMW_DURATION_INFINITE keeps blocking --- rmw_unix_socket_cpp/src/rmw_wait.cpp | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/rmw_unix_socket_cpp/src/rmw_wait.cpp b/rmw_unix_socket_cpp/src/rmw_wait.cpp index 470102d..a2f7b94 100644 --- a/rmw_unix_socket_cpp/src/rmw_wait.cpp +++ b/rmw_unix_socket_cpp/src/rmw_wait.cpp @@ -5,6 +5,7 @@ #include #include +#include #include #include @@ -284,13 +285,19 @@ rmw_ret_t rmw_wait( } } - // Compute timeout + // Compute timeout. -1 means block forever (epoll_wait sentinel). int timeout_ms = -1; if (wait_timeout) { - timeout_ms = static_cast( - wait_timeout->sec * 1000 + wait_timeout->nsec / 1000000); - if (timeout_ms == 0 && wait_timeout->nsec > 0) { - timeout_ms = 1; // At least 1ms + // Accumulate in int64_t; RMW_DURATION_INFINITE (~9.2e12 ms) overflows int. + int64_t ms = static_cast(wait_timeout->sec) * 1000 + + static_cast(wait_timeout->nsec) / 1000000; + if (ms > std::numeric_limits::max()) { + timeout_ms = -1; // Infinite (or beyond epoll's range) -> block forever + } else { + timeout_ms = static_cast(ms); + if (timeout_ms == 0 && wait_timeout->nsec > 0) { + timeout_ms = 1; // At least 1ms + } } }