From: Jérémie Galarneau Date: Wed, 21 Dec 2016 22:56:24 +0000 (-0500) Subject: Fix: protect the channel's metadata stream using the metadata cache lock X-Git-Tag: v2.8.4~2 X-Git-Url: https://git.lttng.org./?a=commitdiff_plain;h=a837d60e6ef365c87361a4486087e40a791a4e5f;p=lttng-tools.git Fix: protect the channel's metadata stream using the metadata cache lock The consumer_thread_data_poll and consumer_thread_metadata_poll both access the channel's metadata stream. During a session destruction, consumer_thread_metadata_poll will destroy all metadata streams. However, the consumer_thread_data_poll may still invoke a consumer_metadata_cache_write() triggered by a "ready" subbuffer. Hence, the metadata stream must be protected from this action by the metadata cache lock. Signed-off-by: Jérémie Galarneau --- diff --git a/src/common/consumer/consumer-metadata-cache.c b/src/common/consumer/consumer-metadata-cache.c index 3211ec1e8..6b15375e1 100644 --- a/src/common/consumer/consumer-metadata-cache.c +++ b/src/common/consumer/consumer-metadata-cache.c @@ -147,7 +147,7 @@ int consumer_metadata_cache_write(struct lttng_consumer_channel *channel, char dummy = 'c'; cache->max_offset = offset + len; - if (channel->monitor) { + if (channel->monitor && channel->metadata_stream) { size_ret = lttng_write(channel->metadata_stream->ust_metadata_poll_pipe[1], &dummy, 1); if (size_ret < 1) { diff --git a/src/common/consumer/consumer.c b/src/common/consumer/consumer.c index 4dec3e809..47df32958 100644 --- a/src/common/consumer/consumer.c +++ b/src/common/consumer/consumer.c @@ -47,6 +47,7 @@ #include #include #include +#include struct lttng_consumer_global_data consumer_data = { .stream_count = 0, @@ -2052,6 +2053,7 @@ void consumer_del_metadata_stream(struct lttng_consumer_stream *stream, pthread_mutex_lock(&consumer_data.lock); pthread_mutex_lock(&stream->chan->lock); + pthread_mutex_lock(&stream->chan->metadata_cache->lock); pthread_mutex_lock(&stream->lock); /* Remove any reference to that stream. */ @@ -2077,6 +2079,7 @@ void consumer_del_metadata_stream(struct lttng_consumer_stream *stream, stream->chan->metadata_stream = NULL; pthread_mutex_unlock(&stream->lock); + pthread_mutex_unlock(&stream->chan->metadata_cache->lock); pthread_mutex_unlock(&stream->chan->lock); pthread_mutex_unlock(&consumer_data.lock);