Skip to content

Commit 8a14588

Browse files
get_all_data_impl() does not handle null pointers properly, causing segmentation fault (backport #2840) (#2851)
Signed-off-by: Alejandro Hernandez Cordero <[email protected]> Co-authored-by: Alejandro Hernández Cordero <[email protected]>
1 parent dd807bf commit 8a14588

File tree

2 files changed

+19
-3
lines changed

2 files changed

+19
-3
lines changed

rclcpp/include/rclcpp/experimental/buffers/ring_buffer_implementation.hpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -255,9 +255,13 @@ class RingBufferImplementation : public BufferImplementationBase<BufferT>
255255
std::vector<BufferT> result_vtr;
256256
result_vtr.reserve(size_);
257257
for (size_t id = 0; id < size_; ++id) {
258-
result_vtr.emplace_back(
259-
new typename is_std_unique_ptr<T>::Ptr_type(
260-
*(ring_buffer_[(read_index_ + id) % capacity_])));
258+
const auto & elem(ring_buffer_[(read_index_ + id) % capacity_]);
259+
if (elem != nullptr) {
260+
result_vtr.emplace_back(new typename is_std_unique_ptr<T>::Ptr_type(
261+
*elem));
262+
} else {
263+
result_vtr.emplace_back(nullptr);
264+
}
261265
}
262266
return result_vtr;
263267
}

rclcpp/test/rclcpp/test_ring_buffer_implementation.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,3 +139,15 @@ TEST(TestRingBufferImplementation, basic_usage_unique_ptr) {
139139
EXPECT_EQ(false, rb.has_data());
140140
EXPECT_EQ(false, rb.is_full());
141141
}
142+
143+
TEST(TestRingBufferImplementation, handle_nullptr_deletion) {
144+
rclcpp::experimental::buffers::RingBufferImplementation<std::unique_ptr<int>> rb(3);
145+
rb.enqueue(std::make_unique<int>(42));
146+
rb.enqueue(nullptr); // intentionally enqueuing nullptr
147+
rb.enqueue(std::make_unique<int>(84));
148+
auto all_data = rb.get_all_data();
149+
EXPECT_EQ(3u, all_data.size());
150+
EXPECT_EQ(42, *(all_data[0]));
151+
EXPECT_EQ(nullptr, all_data[1]);
152+
EXPECT_EQ(84, *(all_data[2]));
153+
}

0 commit comments

Comments
 (0)