Fix: NULL pointer dereference in relay_index_get_by_id_or_create
[lttng-tools.git] / src / bin / lttng-relayd / index.c
index 7182e36cc8e461daf666d6dbc32079dd11b7e5f3..80a4bb94d2a0651dc24100425c52ca4047b06209 100644 (file)
@@ -17,7 +17,6 @@
  * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
-#define _GNU_SOURCE
 #define _LGPL_SOURCE
 #include <assert.h>
 
@@ -144,7 +143,7 @@ struct relay_index *relay_index_get_by_id_or_create(struct relay_stream *stream,
                index = relay_index_create(stream, net_seq_num);
                if (!index) {
                        ERR("Cannot create index for stream id %" PRIu64 " and seq_num %" PRIu64,
-                               index->stream->stream_handle, net_seq_num);
+                               stream->stream_handle, net_seq_num);
                        goto end;
                }
                oldindex = relay_index_add_unique(stream, index);
@@ -163,7 +162,7 @@ struct relay_index *relay_index_get_by_id_or_create(struct relay_stream *stream,
 end:
        rcu_read_unlock();
        DBG2("Index %sfound or created in HT for stream ID %" PRIu64 " and seqnum %" PRIu64,
-                       (index == NULL) ? "NOT " : "", index->stream->stream_handle, net_seq_num);
+                       (index == NULL) ? "NOT " : "", stream->stream_handle, net_seq_num);
        return index;
 }
 
@@ -333,3 +332,42 @@ void relay_index_close_all(struct relay_stream *stream)
        }
        rcu_read_unlock();
 }
+
+void relay_index_close_partial_fd(struct relay_stream *stream)
+{
+       struct lttng_ht_iter iter;
+       struct relay_index *index;
+
+       rcu_read_lock();
+       cds_lfht_for_each_entry(stream->indexes_ht->ht, &iter.iter,
+                       index, index_n.node) {
+               if (!index->index_fd) {
+                       continue;
+               }
+               /*
+                * Partial index has its index_fd: we have only
+                * received its info from the data socket.
+                * Put self-ref from index.
+                */
+               relay_index_put(index);
+       }
+       rcu_read_unlock();
+}
+
+uint64_t relay_index_find_last(struct relay_stream *stream)
+{
+       struct lttng_ht_iter iter;
+       struct relay_index *index;
+       uint64_t net_seq_num = -1ULL;
+
+       rcu_read_lock();
+       cds_lfht_for_each_entry(stream->indexes_ht->ht, &iter.iter,
+                       index, index_n.node) {
+               if (net_seq_num == -1ULL ||
+                               index->index_n.key > net_seq_num) {
+                       net_seq_num = index->index_n.key;
+               }
+       }
+       rcu_read_unlock();
+       return net_seq_num;
+}
This page took 0.023719 seconds and 4 git commands to generate.