Null deallocated jump callbacks (#294)

* Add failing test for add-remove-add callback

* Fix crash when adding callback after last was removed
This commit is contained in:
Shane Loretz 2018-09-06 14:06:45 -07:00 committed by GitHub
parent f93072b1b8
commit e78e400018
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 31 additions and 0 deletions

View file

@ -464,6 +464,7 @@ rcl_clock_remove_jump_callback(
// Shrink size of the callback array // Shrink size of the callback array
if (clock->num_jump_callbacks == 1) { if (clock->num_jump_callbacks == 1) {
clock->allocator.deallocate(clock->jump_callbacks, clock->allocator.state); clock->allocator.deallocate(clock->jump_callbacks, clock->allocator.state);
clock->jump_callbacks = NULL;
} else { } else {
rcl_jump_callback_info_t * callbacks = clock->allocator.reallocate( rcl_jump_callback_info_t * callbacks = clock->allocator.reallocate(
clock->jump_callbacks, sizeof(rcl_jump_callback_info_t) * (clock->num_jump_callbacks - 1), clock->jump_callbacks, sizeof(rcl_jump_callback_info_t) * (clock->num_jump_callbacks - 1),

View file

@ -670,3 +670,33 @@ TEST(CLASSNAME(rcl_time, RMW_IMPLEMENTATION), rcl_clock_remove_jump_callback) {
EXPECT_EQ(RCL_RET_OK, rcl_clock_remove_jump_callback(clock, cb, user_data2)); EXPECT_EQ(RCL_RET_OK, rcl_clock_remove_jump_callback(clock, cb, user_data2));
EXPECT_EQ(0u, clock->num_jump_callbacks); EXPECT_EQ(0u, clock->num_jump_callbacks);
} }
TEST(CLASSNAME(rcl_time, RMW_IMPLEMENTATION), add_remove_add_jump_callback) {
rcl_allocator_t allocator = rcl_get_default_allocator();
rcl_clock_t * clock =
reinterpret_cast<rcl_clock_t *>(allocator.allocate(sizeof(rcl_clock_t), allocator.state));
OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT({
allocator.deallocate(clock, allocator.state);
});
rcl_ret_t retval = rcl_ros_clock_init(clock, &allocator);
ASSERT_EQ(RCL_RET_OK, retval) << rcl_get_error_string_safe();
OSRF_TESTING_TOOLS_CPP_SCOPE_EXIT({
EXPECT_EQ(RCL_RET_OK, rcl_clock_fini(clock));
});
rcl_jump_threshold_t threshold;
threshold.on_clock_change = false;
threshold.min_forward.nanoseconds = 0;
threshold.min_backward.nanoseconds = 0;
rcl_jump_callback_t cb = reinterpret_cast<rcl_jump_callback_t>(0xBEEF);
void * user_data = reinterpret_cast<void *>(0xCAFE);
ASSERT_EQ(RCL_RET_OK, rcl_clock_add_jump_callback(clock, threshold, cb, user_data)) <<
rcl_get_error_string_safe();
EXPECT_EQ(1u, clock->num_jump_callbacks);
EXPECT_EQ(RCL_RET_OK, rcl_clock_remove_jump_callback(clock, cb, user_data));
EXPECT_EQ(0u, clock->num_jump_callbacks);
EXPECT_EQ(RCL_RET_OK, rcl_clock_add_jump_callback(clock, threshold, cb, user_data)) <<
rcl_get_error_string_safe();
EXPECT_EQ(1u, clock->num_jump_callbacks);
}