Fix: sessiond: double free on duplicate removal of tracer source
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Thu, 28 Jan 2021 19:39:37 +0000 (14:39 -0500)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Thu, 28 Jan 2021 23:02:28 +0000 (18:02 -0500)
commit2fb5e9b7971e2408dce182fcf7e87cd81dcb388b
tree87811b05c16d3c5a6cae6f8e45958744c44ad6a8
parent352b58f55f53e7d11fb286ddc26a3bd0ecdd02f5
Fix: sessiond: double free on duplicate removal of tracer source

An unrelated bug (fixed in a separate commit) can cause an event source
to be removed from the notification thread's monitored sources twice.

The event source removal starts by searching for the source to remove
based on the source pipe's read-end fd number and assumes that it will
always be found. After iterating on the list, an assertion that
`source_element` is not NULL is done in the assumption that NULL would
mean that the source was not found.

This is incorrect since, if the source is not found, `source_element`
will simply point to the last element of the list, causing the assertion
to succeed.

Then, the last source in the list is torn down, but not removed from the
list. This causes that event source to be free'd twice when it is
actually removed later on.

The assumption that an event source can always be found does not hold
for the moment. For instance, when an application can exit, closing its
end of the notification pipe, the notification thread could wake-up
before the application management thread.

In that case, the notification thread will react to the event by
removing the application's source from its monitored sources. Then, when
the application management thread wakes up, it will ask the notification
thread to (again) remove the event source, which will fail as it will
not be found.

Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Change-Id: I7b5ebf90b868faded47a4e9675e01e1fb2b77a70
src/bin/lttng-sessiond/notification-thread-events.c
This page took 0.026148 seconds and 4 git commands to generate.