Skip to content

Commit 13b2456

Browse files
committed
fix: add nullptr check when pushing new messages to the message cache
Signed-off-by: Jose Faria <[email protected]>
1 parent 73b5029 commit 13b2456

File tree

3 files changed

+26
-1
lines changed

3 files changed

+26
-1
lines changed

rosbag2_cpp/src/rosbag2_cpp/cache/circular_message_cache.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,10 @@ CircularMessageCache::~CircularMessageCache()
4242

4343
bool CircularMessageCache::push(std::shared_ptr<const rosbag2_storage::SerializedBagMessage> msg)
4444
{
45+
if (msg == nullptr) {
46+
return false;
47+
}
48+
4549
std::lock_guard<std::mutex> cache_lock(producer_buffer_mutex_);
4650
producer_buffer_->push(msg);
4751
// Always return true since circular message cache drops old messages by design and it

rosbag2_cpp/src/rosbag2_cpp/cache/message_cache_circular_buffer.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,10 @@ MessageCacheCircularBuffer::MessageCacheCircularBuffer(size_t max_cache_size)
3232

3333
bool MessageCacheCircularBuffer::push(CacheBufferInterface::buffer_element_t msg)
3434
{
35+
if (msg == nullptr) {
36+
return false;
37+
}
38+
3539
// Drop message if it exceeds the buffer size
3640
if (msg->serialized_data->buffer_length > max_bytes_size_) {
3741
ROSBAG2_CPP_LOG_WARN_STREAM("Last message exceeds snapshot buffer size. Dropping message!");

rosbag2_cpp/test/rosbag2_cpp/test_message_cache.cpp

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
// limitations under the License.
1414

1515
#include <gmock/gmock.h>
16-
16+
#include <gtest/gtest.h>
1717
#include <chrono>
1818
#include <numeric>
1919
#include <memory>
@@ -23,12 +23,14 @@
2323
#include <vector>
2424
#include <thread>
2525

26+
#include "rosbag2_cpp/cache/message_cache_circular_buffer.hpp"
2627
#include "rosbag2_storage/ros_helper.hpp"
2728
#include "rosbag2_storage/serialized_bag_message.hpp"
2829

2930
#include "mock_cache_consumer.hpp"
3031
#include "mock_message_cache.hpp"
3132

33+
3234
using namespace testing; // NOLINT
3335

3436
namespace
@@ -105,3 +107,18 @@ TEST_F(MessageCacheTest, message_cache_writes_full_producer_buffer) {
105107
mock_cache_consumer->stop();
106108
EXPECT_EQ(consumed_message_count, message_count - should_be_dropped_count);
107109
}
110+
111+
class MessageCacheCircularBufferTest : public testing::Test {
112+
protected:
113+
MessageCacheCircularBufferTest()
114+
: buffer_(1024) {}
115+
rosbag2_cpp::cache::MessageCacheCircularBuffer buffer_;
116+
};
117+
118+
TEST_F(MessageCacheCircularBufferTest, PushNullptrCausesCrash) {
119+
bool result = true;
120+
ASSERT_NO_THROW({
121+
result = buffer_.push(nullptr);
122+
});
123+
EXPECT_FALSE(result);
124+
}

0 commit comments

Comments
 (0)