Fix: application SIGBUS when starting in parallel with sessiond
[lttng-ust.git] / libringbuffer / ring_buffer_backend.c
index ae8365227c3405fcb39aad8a32eba3e5d730be14..3db1f860f3918d8a1e61a959e1f4501678f93687 100644 (file)
@@ -280,7 +280,8 @@ int channel_backend_init(struct channel_backend *chanb,
                for_each_possible_cpu(i) {
                        struct shm_object *shmobj;
 
-                       shmobj = shm_object_table_append(handle->table, shmsize);
+                       shmobj = shm_object_table_alloc(handle->table, shmsize,
+                                       SHM_OBJECT_SHM);
                        if (!shmobj)
                                goto end;
                        align_shm(shmobj, __alignof__(struct lttng_ust_lib_ring_buffer));
@@ -298,7 +299,8 @@ int channel_backend_init(struct channel_backend *chanb,
                struct shm_object *shmobj;
                struct lttng_ust_lib_ring_buffer *buf;
 
-               shmobj = shm_object_table_append(handle->table, shmsize);
+               shmobj = shm_object_table_alloc(handle->table, shmsize,
+                                       SHM_OBJECT_SHM);
                if (!shmobj)
                        goto end;
                align_shm(shmobj, __alignof__(struct lttng_ust_lib_ring_buffer));
@@ -379,8 +381,9 @@ size_t lib_ring_buffer_read(struct lttng_ust_lib_ring_buffer_backend *bufb, size
  * @dest : destination address
  * @len : destination's length
  *
- * return string's length
+ * Return string's length, or -EINVAL on error.
  * Should be protected by get_subbuf/put_subbuf.
+ * Destination length should be at least 1 to hold '\0'.
  */
 int lib_ring_buffer_read_cstr(struct lttng_ust_lib_ring_buffer_backend *bufb, size_t offset,
                              void *dest, size_t len, struct lttng_ust_shm_handle *handle)
@@ -392,6 +395,8 @@ int lib_ring_buffer_read_cstr(struct lttng_ust_lib_ring_buffer_backend *bufb, si
        struct lttng_ust_lib_ring_buffer_backend_pages_shmp *rpages;
        unsigned long sb_bindex, id;
 
+       if (caa_unlikely(!len))
+               return -EINVAL;
        offset &= chanb->buf_size - 1;
        orig_offset = offset;
        id = bufb->buf_rsb.id;
This page took 0.02357 seconds and 4 git commands to generate.