Skip to content

Memory issue when adding and removing time jump callbacks #293

@greimela-si

Description

@greimela-si

Bug report

Required Info:

Steps to reproduce issue

  1. Create an instance of the rcl clock struct
  2. Add some time jump handler
  3. Remove this time jump handler
  4. Add a new time jump handler

Condensed example:

rcl_clock_add_jump_callback(&rcl_clock_, threshold, Clock::on_time_jump, some_handler);

rcl_clock_remove_jump_callback(&rcl_clock_, rclcpp::Clock::on_time_jump, some_handler)

rcl_clock_add_jump_callback(&rcl_clock_, threshold, Clock::on_time_jump, new_handler);

Expected behavior

The new time jump handler is registered in the clock.

Actual behavior

The new time jump handler is not registered in the clock, allocator.realloc() fails inside rcl_clock_add_jump_callback().
I suppose this originates in rcl_clock.jump_callbacks pointing to freed memory after rcl_clock_remove_jump_callback() has been called.
Reallocating a pointer that points to freed memory seems to be undefined behavior according to cppreference.

Additional information

One possible fix for this issue could be to use malloc() instead of realloc() in rcl_clock_add_jump_callback() if rcl_clock.num_jump_callbacks == 0.

@sloretz I think this functionality has been introduced in #284, any ideas?

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions