Fix: refuse overwrite mode buffers with less than two subbuffers
[lttng-modules.git] / lib / ringbuffer / ring_buffer_backend.c
index 8e1a796a55071abb6f388b2c9ed11cc34b7ed845..3cc22d77b2d9ad5c2ed428fed783b9055a5f97d3 100644 (file)
@@ -331,6 +331,12 @@ int channel_backend_init(struct channel_backend *chanb,
                return -EINVAL;
        if (!num_subbuf || (num_subbuf & (num_subbuf - 1)))
                return -EINVAL;
+       /*
+        * Overwrite mode buffers require at least 2 subbuffers per
+        * buffer.
+        */
+       if (config->mode == RING_BUFFER_OVERWRITE && num_subbuf < 2)
+               return -EINVAL;
 
        ret = subbuffer_id_check_index(config, num_subbuf);
        if (ret)
@@ -478,7 +484,7 @@ void channel_backend_free(struct channel_backend *chanb)
  * @pagecpy : page size copied so far
  */
 void _lib_ring_buffer_write(struct lib_ring_buffer_backend *bufb, size_t offset,
-                           const void *src, size_t len, ssize_t pagecpy)
+                           const void *src, size_t len, size_t pagecpy)
 {
        struct channel_backend *chanb = &bufb->chan->backend;
        const struct lib_ring_buffer_config *config = &chanb->config;
@@ -524,7 +530,7 @@ EXPORT_SYMBOL_GPL(_lib_ring_buffer_write);
  */
 void _lib_ring_buffer_memset(struct lib_ring_buffer_backend *bufb,
                             size_t offset,
-                            int c, size_t len, ssize_t pagecpy)
+                            int c, size_t len, size_t pagecpy)
 {
        struct channel_backend *chanb = &bufb->chan->backend;
        const struct lib_ring_buffer_config *config = &chanb->config;
@@ -654,7 +660,7 @@ EXPORT_SYMBOL_GPL(_lib_ring_buffer_strcpy);
 void _lib_ring_buffer_copy_from_user_inatomic(struct lib_ring_buffer_backend *bufb,
                                      size_t offset,
                                      const void __user *src, size_t len,
-                                     ssize_t pagecpy)
+                                     size_t pagecpy)
 {
        struct channel_backend *chanb = &bufb->chan->backend;
        const struct lib_ring_buffer_config *config = &chanb->config;
@@ -795,8 +801,7 @@ size_t lib_ring_buffer_read(struct lib_ring_buffer_backend *bufb, size_t offset,
 {
        struct channel_backend *chanb = &bufb->chan->backend;
        const struct lib_ring_buffer_config *config = &chanb->config;
-       size_t index;
-       ssize_t pagecpy, orig_len;
+       size_t index, pagecpy, orig_len;
        struct lib_ring_buffer_backend_pages *rpages;
        unsigned long sb_bindex, id;
 
This page took 0.025032 seconds and 4 git commands to generate.