Fix: relayd: assertion fails on creation of session by peer < 2.11
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Thu, 2 Apr 2020 19:47:30 +0000 (15:47 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Fri, 3 Apr 2020 23:47:19 +0000 (19:47 -0400)
Observed issue
==============

An assertion that a chunk has no active directory handle fails when
creating an anonymous chunk. More specifically, this occurs when
associating an fd tracker to the newly created anonymous trace chunk.

This occurs when a session is created by a peer that is older than
2.11.

Cause
=====

Trace chunks that should monitor their file descriptors with a file
descriptor tracker must be associated with the tracker before any
other operation occurs on the chunk. This is to ensure that "raw" file
descriptors are not created when they were meant to be tracked.

Here, the credentials and session output directory are set before the
file descriptor tracker was provided to the anonymous chunk which is a
breach of the API contract (enforced by the assert()).

Solution
========

Associate the fd tracker immediately to the anonymous chunk before
providing it with a reference to the file descriptor
tracker. Moreover, a leak of the output_directory is prevented by not
setting it to NULL. The trace chunk will acquire a reference to the
trace chunk; it is not transferred to the trace chunk.

Note
====

The problem was introduced during the 2.12 release cycle (clear
feature); this doesn't need to be backported.

Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Change-Id: I92ca2f156f500dfe02e09f8b4783447e46710246

src/bin/lttng-relayd/session.c

index f40f70965c97d6a1ceffdf85a066a7a282dd1d1c..9f690d3af68d5eaf0a319b2c8439534587249101 100644 (file)
@@ -220,6 +220,7 @@ static int session_set_anonymous_chunk(struct relay_session *session)
                goto end;
        }
 
+       lttng_trace_chunk_set_fd_tracker(chunk, the_fd_tracker);
        status = lttng_trace_chunk_set_credentials_current_user(chunk);
        if (status != LTTNG_TRACE_CHUNK_STATUS_OK) {
                ret = -1;
@@ -232,8 +233,6 @@ static int session_set_anonymous_chunk(struct relay_session *session)
                goto end;
        }
 
-       lttng_trace_chunk_set_fd_tracker(chunk, the_fd_tracker);
-       output_directory = NULL;
        session->current_trace_chunk = chunk;
        chunk = NULL;
 end:
This page took 0.026659 seconds and 4 git commands to generate.