From 7c0c262bb4f03a693eea36e8ffab6aedea370237 Mon Sep 17 00:00:00 2001 From: Barry Xu Date: Sat, 19 Sep 2020 10:41:51 +0800 Subject: [PATCH 1/2] Make sure type can be unregistered successfully Signed-off-by: Barry Xu --- rmw_fastrtps_cpp/src/subscription.cpp | 19 +++++++++++-------- rmw_fastrtps_dynamic_cpp/src/subscription.cpp | 11 ++++++++++- 2 files changed, 21 insertions(+), 9 deletions(-) diff --git a/rmw_fastrtps_cpp/src/subscription.cpp b/rmw_fastrtps_cpp/src/subscription.cpp index c0fc6941e..c446c6534 100644 --- a/rmw_fastrtps_cpp/src/subscription.cpp +++ b/rmw_fastrtps_cpp/src/subscription.cpp @@ -110,13 +110,6 @@ create_subscription( if (info->type_support_) { _unregister_type(participant, info->type_support_); } - if (info->subscriber_) { - if (!Domain::removeSubscriber(info->subscriber_)) { - RMW_SAFE_FWRITE_TO_STDERR( - "Failed to remove subscriber after '" - RCUTILS_STRINGIFY(__function__) "' failed.\n"); - } - } delete info->listener_; delete info; }); @@ -164,6 +157,15 @@ create_subscription( RMW_SET_ERROR_MSG("create_subscriber() could not create subscriber"); return nullptr; } + auto cleanup_subscription = rcpputils::make_scope_exit( + [info]() { + if (!Domain::removeSubscriber(info->subscriber_)) { + RMW_SAFE_FWRITE_TO_STDERR( + "Failed to remove subscriber after '" + RCUTILS_STRINGIFY(__function__) "' failed.\n"); + } + }); + info->subscription_gid_ = rmw_fastrtps_shared_cpp::create_rmw_gid( eprosima_fastrtps_identifier, info->subscriber_->getGuid()); @@ -172,7 +174,7 @@ create_subscription( RMW_SET_ERROR_MSG("failed to allocate subscription"); return nullptr; } - auto cleanup_subscription = rcpputils::make_scope_exit( + auto cleanup_rmw_subscription = rcpputils::make_scope_exit( [rmw_subscription]() { rmw_free(const_cast(rmw_subscription->topic_name)); rmw_subscription_free(rmw_subscription); @@ -189,6 +191,7 @@ create_subscription( rmw_subscription->options = *subscription_options; rmw_subscription->can_loan_messages = false; + cleanup_rmw_subscription.cancel(); cleanup_subscription.cancel(); cleanup_info.cancel(); return rmw_subscription; diff --git a/rmw_fastrtps_dynamic_cpp/src/subscription.cpp b/rmw_fastrtps_dynamic_cpp/src/subscription.cpp index 9f8f2ca22..ab662b84e 100644 --- a/rmw_fastrtps_dynamic_cpp/src/subscription.cpp +++ b/rmw_fastrtps_dynamic_cpp/src/subscription.cpp @@ -177,6 +177,14 @@ create_subscription( RMW_SET_ERROR_MSG("create_subscriber() could not create subscriber"); return nullptr; } + auto cleanup_subscription = rcpputils::make_scope_exit( + [info]() { + if (!Domain::removeSubscriber(info->subscriber_)) { + RMW_SAFE_FWRITE_TO_STDERR( + "Failed to remove subscriber after '" + RCUTILS_STRINGIFY(__function__) "' failed.\n"); + } + }); info->subscription_gid_ = rmw_fastrtps_shared_cpp::create_rmw_gid( eprosima_fastrtps_identifier, info->subscriber_->getGuid()); @@ -185,7 +193,7 @@ create_subscription( RMW_SET_ERROR_MSG("failed to allocate subscription"); return nullptr; } - auto cleanup_subscription = rcpputils::make_scope_exit( + auto cleanup_rmw_subscription = rcpputils::make_scope_exit( [rmw_subscription]() { rmw_free(const_cast(rmw_subscription->topic_name)); rmw_subscription_free(rmw_subscription); @@ -204,6 +212,7 @@ create_subscription( rmw_subscription->options = *subscription_options; rmw_subscription->can_loan_messages = false; + cleanup_rmw_subscription.cancel(); cleanup_subscription.cancel(); cleanup_info.cancel(); return rmw_subscription; From e9d02dfe5bcec3f92072826a96a38096426669a3 Mon Sep 17 00:00:00 2001 From: Barry Xu Date: Wed, 23 Sep 2020 09:28:41 +0800 Subject: [PATCH 2/2] Remove double free codes Signed-off-by: Barry Xu --- rmw_fastrtps_dynamic_cpp/src/subscription.cpp | 7 ------- 1 file changed, 7 deletions(-) diff --git a/rmw_fastrtps_dynamic_cpp/src/subscription.cpp b/rmw_fastrtps_dynamic_cpp/src/subscription.cpp index ab662b84e..b68662bac 100644 --- a/rmw_fastrtps_dynamic_cpp/src/subscription.cpp +++ b/rmw_fastrtps_dynamic_cpp/src/subscription.cpp @@ -118,13 +118,6 @@ create_subscription( if (info->type_support_) { _unregister_type(participant, info->type_support_); } - if (info->subscriber_) { - if (!Domain::removeSubscriber(info->subscriber_)) { - RMW_SAFE_FWRITE_TO_STDERR( - "Failed to remove subscriber after '" - RCUTILS_STRINGIFY(__function__) "' function failed.\n"); - } - } delete info->listener_; delete info; });