ABI: refuse non-matching ABI minor version on event registration
[lttng-ust.git] / liblttng-ust-ctl / ustctl.c
index ca17255d914e9b65346685e4e1988382d5e18d0b..5a7fa61fa17064be30a524a3c8dd04c28b7c1da6 100644 (file)
@@ -32,6 +32,7 @@
 #include "../libringbuffer/frontend.h"
 #include "../liblttng-ust/wait.h"
 #include "../liblttng-ust/lttng-rb-clients.h"
+#include "../liblttng-ust/clock.h"
 
 /*
  * Number of milliseconds to retry before failing metadata writes on
@@ -1340,6 +1341,8 @@ int ustctl_get_mmap_read_offset(struct ustctl_consumer_stream *stream,
        unsigned long sb_bindex;
        struct lttng_ust_lib_ring_buffer *buf;
        struct ustctl_consumer_channel *consumer_chan;
+       struct lttng_ust_lib_ring_buffer_backend_pages_shmp *barray_idx;
+       struct lttng_ust_lib_ring_buffer_backend_pages *pages;
 
        if (!stream)
                return -EINVAL;
@@ -1350,8 +1353,14 @@ int ustctl_get_mmap_read_offset(struct ustctl_consumer_stream *stream,
                return -EINVAL;
        sb_bindex = subbuffer_id_get_index(&chan->backend.config,
                                        buf->backend.buf_rsb.id);
-       *off = shmp(consumer_chan->chan->handle,
-               shmp_index(consumer_chan->chan->handle, buf->backend.array, sb_bindex)->shmp)->mmap_offset;
+       barray_idx = shmp_index(consumer_chan->chan->handle, buf->backend.array,
+                       sb_bindex);
+       if (!barray_idx)
+               return -EINVAL;
+       pages = shmp(consumer_chan->chan->handle, barray_idx->shmp);
+       if (!pages)
+               return -EINVAL;
+       *off = pages->mmap_offset;
        return 0;
 }
 
@@ -1517,6 +1526,8 @@ struct lttng_ust_client_lib_ring_buffer_client_cb *get_client_cb(
        struct lttng_ust_client_lib_ring_buffer_client_cb *client_cb;
 
        chan = shmp(handle, buf->backend.chan);
+       if (!chan)
+               return NULL;
        config = &chan->backend.config;
        if (!config->cb_ptr)
                return NULL;
@@ -1726,6 +1737,17 @@ int ustctl_recv_reg_msg(int sock,
                return -LTTNG_UST_ERR_UNSUP_MAJOR;
        }
 
+       /*
+        * Addition of enumeration inside _ustclt_basic_type should have been
+        * marked as a breaking ABI change since it blows past the included
+        * padding hence result in bigger than expected struct. Refuse
+        * registration for non-matching minor version since only two minor
+        * versions exist for ust-2.7(6.0) and 2.8(6.1).
+        */
+       if (reg_msg.minor != LTTNG_UST_ABI_MINOR_VERSION) {
+               return -LTTNG_UST_ERR_UNSUP_MAJOR;
+       }
+
        return 0;
 }
 
@@ -2003,6 +2025,7 @@ static __attribute__((constructor))
 void ustctl_init(void)
 {
        init_usterr();
+       lttng_ust_clock_init();
        lttng_ring_buffer_metadata_client_init();
        lttng_ring_buffer_client_overwrite_init();
        lttng_ring_buffer_client_overwrite_rt_init();
This page took 0.023336 seconds and 4 git commands to generate.