From 1f7baf2ee566ba6d52570ab71fecc030fe82a736 Mon Sep 17 00:00:00 2001 From: Chris Lalancette Date: Thu, 29 Oct 2020 08:15:52 -0400 Subject: [PATCH] Make sure to always check return values. (#840) * Make sure to always check return values. Pointed out by clang static analysis, we should always check these return values. Signed-off-by: Chris Lalancette --- rcl_action/src/rcl_action/graph.c | 18 +++++++++++++++++- rcl_lifecycle/src/rcl_lifecycle.c | 4 ++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/rcl_action/src/rcl_action/graph.c b/rcl_action/src/rcl_action/graph.c index ce84742..88c2e87 100644 --- a/rcl_action/src/rcl_action/graph.c +++ b/rcl_action/src/rcl_action/graph.c @@ -122,7 +122,10 @@ _filter_action_names( // Cleanup if there is an error if (RCL_RET_OK != ret) { rcl_ret_t fini_ret = rcl_names_and_types_fini(action_names_and_types); - (void)fini_ret; // Error already set + if (RCL_RET_OK != fini_ret) { + RCUTILS_SAFE_FWRITE_TO_STDERR( + "Freeing names and types failed while handling a previous error. Leaking memory!\n"); + } } return ret; @@ -154,6 +157,10 @@ rcl_action_get_client_names_and_types_by_node( rcl_ret_t nat_fini_ret = rcl_names_and_types_fini(&topic_names_and_types); if (RCL_RET_OK != nat_fini_ret) { ret = rcl_names_and_types_fini(action_names_and_types); + if (RCL_RET_OK != ret) { + RCUTILS_SAFE_FWRITE_TO_STDERR( + "Freeing names and types failed while handling a previous error. Leaking memory!\n"); + } return nat_fini_ret; } return ret; @@ -185,6 +192,11 @@ rcl_action_get_server_names_and_types_by_node( rcl_ret_t nat_fini_ret = rcl_names_and_types_fini(&topic_names_and_types); if (RCL_RET_OK != nat_fini_ret) { ret = rcl_names_and_types_fini(action_names_and_types); + if (RCL_RET_OK != ret) { + RCUTILS_SAFE_FWRITE_TO_STDERR( + "Freeing names and types failed while handling a previous error. Leaking memory!\n"); + } + return nat_fini_ret; } return ret; @@ -211,6 +223,10 @@ rcl_action_get_names_and_types( rcl_ret_t nat_fini_ret = rcl_names_and_types_fini(&topic_names_and_types); if (RCL_RET_OK != nat_fini_ret) { ret = rcl_names_and_types_fini(action_names_and_types); + if (RCL_RET_OK != ret) { + RCUTILS_SET_ERROR_MSG( + "Freeing names and types failed while handling a previous error. Leaking memory!\n"); + } return nat_fini_ret; } return ret; diff --git a/rcl_lifecycle/src/rcl_lifecycle.c b/rcl_lifecycle/src/rcl_lifecycle.c index ee3d7fe..56dc6b4 100644 --- a/rcl_lifecycle/src/rcl_lifecycle.c +++ b/rcl_lifecycle/src/rcl_lifecycle.c @@ -234,6 +234,10 @@ rcl_lifecycle_state_machine_init( // init default state machine might have allocated memory, // so we have to call fini ret = rcl_lifecycle_state_machine_fini(state_machine, node_handle, allocator); + if (ret != RCL_RET_OK) { + RCUTILS_SAFE_FWRITE_TO_STDERR( + "Freeing state machine failed while handling a previous error. Leaking memory!\n"); + } return RCL_RET_ERROR; } }