Skip to content

Commit 1e5cd9c

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> Signed-off-by: Michael Orlov <michael.orlov@apex.ai>
1 parent df3a303 commit 1e5cd9c

File tree

1 file changed

+23
-4
lines changed

1 file changed

+23
-4
lines changed

rclcpp/src/rclcpp/serialized_message.cpp

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,13 @@ 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(&to, from.buffer_capacity);
34+
}
35+
3136
if (RCL_RET_OK != ret) {
3237
rclcpp::exceptions::throw_from_rcl_error(ret);
3338
}
@@ -78,7 +83,6 @@ SerializedMessage::SerializedMessage(rcl_serialized_message_t && other)
7883
SerializedMessage & SerializedMessage::operator=(const SerializedMessage & other)
7984
{
8085
if (this != &other) {
81-
serialized_message_ = rmw_get_zero_initialized_serialized_message();
8286
copy_rcl_message(other.serialized_message_, serialized_message_);
8387
}
8488

@@ -88,7 +92,6 @@ SerializedMessage & SerializedMessage::operator=(const SerializedMessage & other
8892
SerializedMessage & SerializedMessage::operator=(const rcl_serialized_message_t & other)
8993
{
9094
if (&serialized_message_ != &other) {
91-
serialized_message_ = rmw_get_zero_initialized_serialized_message();
9295
copy_rcl_message(other, serialized_message_);
9396
}
9497

@@ -98,6 +101,14 @@ SerializedMessage & SerializedMessage::operator=(const rcl_serialized_message_t
98101
SerializedMessage & SerializedMessage::operator=(SerializedMessage && other)
99102
{
100103
if (this != &other) {
104+
if (nullptr != serialized_message_.buffer) {
105+
const auto fini_ret = rmw_serialized_message_fini(&serialized_message_);
106+
if (RCL_RET_OK != fini_ret) {
107+
RCLCPP_ERROR(
108+
get_logger("rclcpp"),
109+
"Failed to destroy serialized message: %s", rcl_get_error_string().str);
110+
}
111+
}
101112
serialized_message_ =
102113
std::exchange(other.serialized_message_, rmw_get_zero_initialized_serialized_message());
103114
}
@@ -108,6 +119,14 @@ SerializedMessage & SerializedMessage::operator=(SerializedMessage && other)
108119
SerializedMessage & SerializedMessage::operator=(rcl_serialized_message_t && other)
109120
{
110121
if (&serialized_message_ != &other) {
122+
if (nullptr != serialized_message_.buffer) {
123+
const auto fini_ret = rmw_serialized_message_fini(&serialized_message_);
124+
if (RCL_RET_OK != fini_ret) {
125+
RCLCPP_ERROR(
126+
get_logger("rclcpp"),
127+
"Failed to destroy serialized message: %s", rcl_get_error_string().str);
128+
}
129+
}
111130
serialized_message_ =
112131
std::exchange(other, rmw_get_zero_initialized_serialized_message());
113132
}

0 commit comments

Comments
 (0)