From 41cb947d2accb23b376ab59ea27423efc2e8a008 Mon Sep 17 00:00:00 2001 From: Yuri Goldfeld Date: Wed, 22 Apr 2026 19:21:33 -0700 Subject: [PATCH 1/2] Fixed bug class across various Flow-IPC modules wherein the formally-allowed (and perfectly practical) `Logger* logger_ptr = nullptr` API arg value would result in a crash. (This was ready in a coming-soon release, but for the ongoing `borrow_object()` hardening preceding that release the new unit test tickles it. Hence backporting the straightforward fix, though it is unrelated to the substance of the aforementioned hardening effort.) --- src/ipc/transport/bipc_mq_handle.cpp | 4 ++-- src/ipc/transport/posix_mq_handle.cpp | 15 +++++++++------ 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/ipc/transport/bipc_mq_handle.cpp b/src/ipc/transport/bipc_mq_handle.cpp index d608b26..ebc8239 100644 --- a/src/ipc/transport/bipc_mq_handle.cpp +++ b/src/ipc/transport/bipc_mq_handle.cpp @@ -58,9 +58,9 @@ Bipc_mq_handle::Bipc_mq_handle(Mode_tag mode_tag, flow::log::Logger* logger_ptr, constexpr char const * MODE_STR = std::is_same_v ? "create-only" : "open-or-create"; - if (get_logger()->should_log(Sev::S_TRACE, get_log_component())) + if (logger_ptr && logger_ptr->should_log(Sev::S_TRACE, get_log_component())) { - ios_all_saver saver(*(get_logger()->this_thread_ostream())); // Revert std::oct/etc. soon. + ios_all_saver saver{*(logger_ptr->this_thread_ostream())}; // Revert std::oct/etc. soon. FLOW_LOG_TRACE_WITHOUT_CHECKING ("Bipc_mq_handle [" << *this << "]: Constructing MQ handle to MQ at name [" << absolute_name() << "] in " "[" << MODE_STR << "] mode; max msg size [" << max_msg_sz << "] x [" << max_n_msg << "] msgs; " diff --git a/src/ipc/transport/posix_mq_handle.cpp b/src/ipc/transport/posix_mq_handle.cpp index 524e57c..b283227 100644 --- a/src/ipc/transport/posix_mq_handle.cpp +++ b/src/ipc/transport/posix_mq_handle.cpp @@ -88,10 +88,11 @@ Posix_mq_handle::Posix_mq_handle(Mode_tag, flow::log::Logger* logger_ptr, const constexpr bool CREATE_ONLY_ELSE_MAYBE = std::is_same_v; constexpr char const * MODE_STR = CREATE_ONLY_ELSE_MAYBE ? "create-only" : "open-or-create"; + if (logger_ptr && logger_ptr->should_log(Sev::S_TRACE, get_log_component())) { - ios_all_saver saver(*(get_logger()->this_thread_ostream())); // Revert std::oct/etc. soon. + ios_all_saver saver{*(logger_ptr->this_thread_ostream())}; // Revert std::oct/etc. soon. - FLOW_LOG_TRACE + FLOW_LOG_TRACE_WITHOUT_CHECKING ("Posix_mq_handle [" << *this << "]: Constructing MQ handle to MQ at name [" << absolute_name() << "] in " "[" << MODE_STR << "] mode; max msg size [" << max_msg_sz << "] x [" << max_n_msg << "] msgs; " "perms = [" << std::setfill('0') << std::setw(4) << std::oct << perms.get_permissions() << "]."); @@ -213,9 +214,10 @@ Posix_mq_handle::Posix_mq_handle(Mode_tag, flow::log::Logger* logger_ptr, const // else if (no_such_file_or_directory): Open failed, because MQ *just* got unlinked. Try again! // This is fun and rare enough to warrant an INFO message. + if (logger_ptr && logger_ptr->should_log(Sev::S_INFO, get_log_component())) { - ios_all_saver saver(*(get_logger()->this_thread_ostream())); // Revert std::oct/etc. soon. - FLOW_LOG_INFO + ios_all_saver saver{*(logger_ptr->this_thread_ostream())}; // Revert std::oct/etc. soon. + FLOW_LOG_INFO_WITHOUT_CHECKING ("Posix_mq_handle [" << *this << "]: Create-or-open algorithm encountered the rare concurrency: " "MQ at name [" << absolute_name() << "] existed during the create-only mq_open() but disappeared " "before we were able to complete open-only mq_open(). Retrying in spin-lock fashion. " @@ -257,10 +259,11 @@ Posix_mq_handle::Posix_mq_handle(Mode_tag, flow::log::Logger* logger_ptr, const if (sys_err_code) { + if (logger_ptr && logger_ptr->should_log(Sev::S_WARNING, get_log_component())) { - ios_all_saver saver(*(get_logger()->this_thread_ostream())); // Revert std::oct/etc. soon. + ios_all_saver saver{*(logger_ptr->this_thread_ostream())}; // Revert std::oct/etc. soon. - FLOW_LOG_WARNING + FLOW_LOG_WARNING_WITHOUT_CHECKING ("Posix_mq_handle [" << *this << "]: mq_open() or set_resource_permissions() error (if the latter, details " "above and repeated below; otherwise error details only follow) while " "constructing MQ handle to MQ at name [" << absolute_name() << "] in " From a36bcfbcf924aeafcc23bb6d3963f5cbfbb4ee37 Mon Sep 17 00:00:00 2001 From: Yuri Goldfeld Date: Wed, 22 Apr 2026 19:52:08 -0700 Subject: [PATCH 2/2] (cont) Build fix. --- src/ipc/transport/posix_mq_handle.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ipc/transport/posix_mq_handle.cpp b/src/ipc/transport/posix_mq_handle.cpp index b283227..c67b998 100644 --- a/src/ipc/transport/posix_mq_handle.cpp +++ b/src/ipc/transport/posix_mq_handle.cpp @@ -71,6 +71,7 @@ Posix_mq_handle::Posix_mq_handle(Mode_tag, flow::log::Logger* logger_ptr, const { using util::set_resource_permissions; using flow::error::Runtime_error; + using flow::log::Sev; using boost::io::ios_all_saver; using boost::system::system_category; using ::mq_open;