Skip to content

Commit adffd3c

Browse files
MichaelOrlovkylemarcey
authored andcommitted
Fix for memory leaks in rclcpp::SerializedMessage
Signed-off-by: Michael Orlov <morlovmr@gmail.com> Co-authored-by: kylemarcey <marcey.kyle@gmail.com>
1 parent df3a303 commit adffd3c

File tree

1 file changed

+24
-4
lines changed

1 file changed

+24
-4
lines changed

rclcpp/src/rclcpp/serialized_message.cpp

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,14 @@ namespace rclcpp
2626

2727
inline void copy_rcl_message(const rcl_serialized_message_t & from, rcl_serialized_message_t & to)
2828
{
29-
const auto ret = rmw_serialized_message_init(
30-
&to, from.buffer_capacity, &from.allocator);
29+
auto ret = RCL_RET_ERROR;
30+
if (nullptr == to.buffer) {
31+
ret = rmw_serialized_message_init(&to, from.buffer_capacity, &from.allocator);
32+
} else {
33+
ret = rmw_serialized_message_resize(
34+
&to, from.buffer_capacity);
35+
}
36+
3137
if (RCL_RET_OK != ret) {
3238
rclcpp::exceptions::throw_from_rcl_error(ret);
3339
}
@@ -78,7 +84,6 @@ SerializedMessage::SerializedMessage(rcl_serialized_message_t && other)
7884
SerializedMessage & SerializedMessage::operator=(const SerializedMessage & other)
7985
{
8086
if (this != &other) {
81-
serialized_message_ = rmw_get_zero_initialized_serialized_message();
8287
copy_rcl_message(other.serialized_message_, serialized_message_);
8388
}
8489

@@ -88,7 +93,6 @@ SerializedMessage & SerializedMessage::operator=(const SerializedMessage & other
8893
SerializedMessage & SerializedMessage::operator=(const rcl_serialized_message_t & other)
8994
{
9095
if (&serialized_message_ != &other) {
91-
serialized_message_ = rmw_get_zero_initialized_serialized_message();
9296
copy_rcl_message(other, serialized_message_);
9397
}
9498

@@ -98,6 +102,14 @@ SerializedMessage & SerializedMessage::operator=(const rcl_serialized_message_t
98102
SerializedMessage & SerializedMessage::operator=(SerializedMessage && other)
99103
{
100104
if (this != &other) {
105+
if (nullptr != serialized_message_.buffer) {
106+
const auto fini_ret = rmw_serialized_message_fini(&serialized_message_);
107+
if (RCL_RET_OK != fini_ret) {
108+
RCLCPP_ERROR(
109+
get_logger("rclcpp"),
110+
"Failed to destroy serialized message: %s", rcl_get_error_string().str);
111+
}
112+
}
101113
serialized_message_ =
102114
std::exchange(other.serialized_message_, rmw_get_zero_initialized_serialized_message());
103115
}
@@ -108,6 +120,14 @@ SerializedMessage & SerializedMessage::operator=(SerializedMessage && other)
108120
SerializedMessage & SerializedMessage::operator=(rcl_serialized_message_t && other)
109121
{
110122
if (&serialized_message_ != &other) {
123+
if (nullptr != serialized_message_.buffer) {
124+
const auto fini_ret = rmw_serialized_message_fini(&serialized_message_);
125+
if (RCL_RET_OK != fini_ret) {
126+
RCLCPP_ERROR(
127+
get_logger("rclcpp"),
128+
"Failed to destroy serialized message: %s", rcl_get_error_string().str);
129+
}
130+
}
111131
serialized_message_ =
112132
std::exchange(other, rmw_get_zero_initialized_serialized_message());
113133
}

0 commit comments

Comments
 (0)