From 589be6f10ddbdc848623b9d0311c8397f7a7405c Mon Sep 17 00:00:00 2001 From: Mathias Kraus Date: Wed, 6 Sep 2023 03:10:02 +0200 Subject: [PATCH] iox-#1030 De-register signal handler at the end of main in examples to prevent access to deinitialized resources --- .../icediscovery/iox_wait_for_service.cpp | 4 ++++ .../request_response/client_cxx_waitset.cpp | 15 ++++++++++----- .../request_response_in_c/client_c_waitset.c | 10 +++++++--- iceoryx_examples/waitset/ice_waitset_basic.cpp | 4 ++++ .../waitset_in_c/ice_c_waitset_gateway.c | 3 +++ .../waitset_in_c/ice_c_waitset_grouping.c | 3 +++ .../waitset_in_c/ice_c_waitset_individual.c | 3 +++ .../ice_c_waitset_timer_driven_execution.c | 3 +++ 8 files changed, 37 insertions(+), 8 deletions(-) diff --git a/iceoryx_examples/icediscovery/iox_wait_for_service.cpp b/iceoryx_examples/icediscovery/iox_wait_for_service.cpp index b3a77681e2c..34320b424e3 100644 --- a/iceoryx_examples/icediscovery/iox_wait_for_service.cpp +++ b/iceoryx_examples/icediscovery/iox_wait_for_service.cpp @@ -122,5 +122,9 @@ int main() << std::endl; } + // de-register signal handler before destroying the Discovery + signal(SIGINT, SIG_DFL); + signal(SIGTERM, SIG_DFL); + return (EXIT_SUCCESS); } diff --git a/iceoryx_examples/request_response/client_cxx_waitset.cpp b/iceoryx_examples/request_response/client_cxx_waitset.cpp index edfe49f6299..173bc24c2c7 100644 --- a/iceoryx_examples/request_response/client_cxx_waitset.cpp +++ b/iceoryx_examples/request_response/client_cxx_waitset.cpp @@ -49,11 +49,6 @@ void signalHandler(int) int main() { - auto sigTermGuard = - iox::posix::registerSignalHandler(iox::posix::Signal::TERM, signalHandler).expect("failed to register SIGTERM"); - auto sigIntGuard = - iox::posix::registerSignalHandler(iox::posix::Signal::INT, signalHandler).expect("failed to register SIGINT"); - //! [initialize runtime] iox::runtime::PoshRuntime::initRuntime(APP_NAME); //! [initialize runtime] @@ -63,6 +58,12 @@ int main() //! [create waitset] waitset.emplace(); + // since the waitset is used in signal handler, this must happen after the waitset initialization + auto sigTermGuard = + iox::posix::registerSignalHandler(iox::posix::Signal::TERM, signalHandler).expect("failed to register SIGTERM"); + auto sigIntGuard = + iox::posix::registerSignalHandler(iox::posix::Signal::INT, signalHandler).expect("failed to register SIGINT"); + //! [create client] iox::popo::ClientOptions options; options.responseQueueCapacity = 2U; @@ -131,6 +132,10 @@ int main() } //! [mainloop] + // de-register signal handler before destroying the waitset + signal(SIGINT, SIG_DFL); + signal(SIGTERM, SIG_DFL); + waitset.reset(); std::cout << "shutting down" << std::endl; diff --git a/iceoryx_examples/request_response_in_c/client_c_waitset.c b/iceoryx_examples/request_response_in_c/client_c_waitset.c index 309297a644c..33039dd1e15 100644 --- a/iceoryx_examples/request_response_in_c/client_c_waitset.c +++ b/iceoryx_examples/request_response_in_c/client_c_waitset.c @@ -49,9 +49,6 @@ void sigHandler(int signalValue) int main(void) { - signal(SIGINT, sigHandler); - signal(SIGTERM, sigHandler); - iox_runtime_init(APP_NAME); iox_client_storage_t clientStorage; @@ -72,6 +69,10 @@ int main(void) } //! [create waitset and attach client] + // since the waitset is used in signal handler, this must happen after the waitset initialization + signal(SIGINT, sigHandler); + signal(SIGTERM, sigHandler); + while (keepRunning) { struct AddRequest* request = NULL; @@ -145,6 +146,9 @@ int main(void) } //! [cleanup] + signal(SIGINT, SIG_DFL); + signal(SIGTERM, SIG_DFL); + iox_ws_detach_client_state(waitset, client, ClientState_HAS_RESPONSE); iox_ws_deinit(waitset); iox_client_deinit(client); diff --git a/iceoryx_examples/waitset/ice_waitset_basic.cpp b/iceoryx_examples/waitset/ice_waitset_basic.cpp index cc9e599da6c..6fa8ef336aa 100644 --- a/iceoryx_examples/waitset/ice_waitset_basic.cpp +++ b/iceoryx_examples/waitset/ice_waitset_basic.cpp @@ -96,6 +96,10 @@ int main() std::cout << "shutting down" << std::endl; + // de-register signal handler before destroying the waitset + signal(SIGINT, SIG_DFL); + signal(SIGTERM, SIG_DFL); + waitset.reset(); return (EXIT_SUCCESS); } diff --git a/iceoryx_examples/waitset_in_c/ice_c_waitset_gateway.c b/iceoryx_examples/waitset_in_c/ice_c_waitset_gateway.c index 96281cb2f1c..b4589859a17 100644 --- a/iceoryx_examples/waitset_in_c/ice_c_waitset_gateway.c +++ b/iceoryx_examples/waitset_in_c/ice_c_waitset_gateway.c @@ -151,6 +151,9 @@ int main(void) //! [event loop] //! [cleanup all resources] + signal(SIGINT, SIG_DFL); + signal(SIGTERM, SIG_DFL); + for (uint64_t i = 0U; i < NUMBER_OF_SUBSCRIBERS; ++i) { // not mandatory since iox_sub_deinit will detach the subscriber automatically diff --git a/iceoryx_examples/waitset_in_c/ice_c_waitset_grouping.c b/iceoryx_examples/waitset_in_c/ice_c_waitset_grouping.c index f0db6e840d5..123d75ba0b0 100644 --- a/iceoryx_examples/waitset_in_c/ice_c_waitset_grouping.c +++ b/iceoryx_examples/waitset_in_c/ice_c_waitset_grouping.c @@ -144,6 +144,9 @@ int main(void) //! [event loop] //! [cleanup all resources] + signal(SIGINT, SIG_DFL); + signal(SIGTERM, SIG_DFL); + for (uint64_t i = 0U; i < NUMBER_OF_SUBSCRIBERS; ++i) { iox_sub_deinit(subscriber[i]); diff --git a/iceoryx_examples/waitset_in_c/ice_c_waitset_individual.c b/iceoryx_examples/waitset_in_c/ice_c_waitset_individual.c index a24f47b3426..c67296e9696 100644 --- a/iceoryx_examples/waitset_in_c/ice_c_waitset_individual.c +++ b/iceoryx_examples/waitset_in_c/ice_c_waitset_individual.c @@ -130,6 +130,9 @@ int main(void) //! [event loop] //! [cleanup all resources] + signal(SIGINT, SIG_DFL); + signal(SIGTERM, SIG_DFL); + for (uint64_t i = 0U; i < NUMBER_OF_SUBSCRIBERS; ++i) { iox_sub_deinit(subscriber[i]); diff --git a/iceoryx_examples/waitset_in_c/ice_c_waitset_timer_driven_execution.c b/iceoryx_examples/waitset_in_c/ice_c_waitset_timer_driven_execution.c index 9cd910c3999..48e5e278461 100644 --- a/iceoryx_examples/waitset_in_c/ice_c_waitset_timer_driven_execution.c +++ b/iceoryx_examples/waitset_in_c/ice_c_waitset_timer_driven_execution.c @@ -156,6 +156,9 @@ int main(void) //! [event loop] //! [cleanup all resources] + signal(SIGINT, SIG_DFL); + signal(SIGTERM, SIG_DFL); + joinThread(cyclicTriggerThread); iox_ws_deinit(waitSet); iox_user_trigger_deinit(shutdownTrigger);