Fix: handle writes of length 0
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Sun, 30 Jun 2013 21:45:32 +0000 (17:45 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Sun, 30 Jun 2013 21:49:09 +0000 (17:49 -0400)
lib_ring_buffer_write() could be passed a length of 0. This typically
has no side-effect as far as writing into the buffers is concerned,
except for one detail: in overwrite mode, there is a check to make sure
the sub-buffer can be written into. This check is performed even if
length is 0. In the case where this would fall exactly at the end of a
sub-buffer, the check would fail, because the offset would fall exactly
at the beginning of the next sub-buffer.

Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
libringbuffer/backend.h
libringbuffer/ring_buffer_backend.c

index 125d0a50117097b344f12e28147c1cc1d41cdec6..feefc7a3229f1314cf6813b1f05178a0cc6176e8 100644 (file)
@@ -84,6 +84,8 @@ void lib_ring_buffer_write(const struct lttng_ust_lib_ring_buffer_config *config
        struct lttng_ust_lib_ring_buffer_backend_pages_shmp *rpages;
        unsigned long sb_bindex, id;
 
+       if (caa_unlikely(!len))
+               return;
        offset &= chanb->buf_size - 1;
        sbidx = offset >> chanb->subbuf_size_order;
        id = shmp_index(handle, bufb->buf_wsb, sbidx)->id;
index e7a00144544a9d3e10b502cbdef0bececc990f5b..3db1f860f3918d8a1e61a959e1f4501678f93687 100644 (file)
@@ -381,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)
@@ -394,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.025118 seconds and 4 git commands to generate.