*/
#define _GNU_SOURCE
+#include <unistd.h>
#include <urcu/arch.h>
#include <limits.h>
unsigned long subbuf_size, mmap_offset = 0;
unsigned long num_subbuf_alloc;
unsigned long i;
+ long page_size;
subbuf_size = chanb->subbuf_size;
num_subbuf_alloc = num_subbuf;
if (extra_reader_sb)
num_subbuf_alloc++;
+ page_size = sysconf(_SC_PAGE_SIZE);
+ if (page_size <= 0) {
+ goto page_size_error;
+ }
+
align_shm(shmobj, __alignof__(struct lttng_ust_lib_ring_buffer_backend_pages_shmp));
set_shmp(bufb->array, zalloc_shm(shmobj,
sizeof(struct lttng_ust_lib_ring_buffer_backend_pages_shmp) * num_subbuf_alloc));
/*
* This is the largest element (the buffer pages) which needs to
- * be aligned on PAGE_SIZE.
+ * be aligned on page size.
*/
- align_shm(shmobj, PAGE_SIZE);
+ align_shm(shmobj, page_size);
set_shmp(bufb->memory_map, zalloc_shm(shmobj,
subbuf_size * num_subbuf_alloc));
if (caa_unlikely(!shmp(handle, bufb->memory_map)))
memory_map_error:
/* bufb->array will be freed by shm teardown */
array_error:
+page_size_error:
return -ENOMEM;
}
* @name: channel name
* @config: client ring buffer configuration
* @parent: dentry of parent directory, %NULL for root directory
- * @subbuf_size: size of sub-buffers (> PAGE_SIZE, power of 2)
+ * @subbuf_size: size of sub-buffers (> page size, power of 2)
* @num_subbuf: number of sub-buffers (power of 2)
* @lttng_ust_shm_handle: shared memory handle
* @stream_fds: stream file descriptors.
unsigned int i;
int ret;
size_t shmsize = 0, num_subbuf_alloc;
+ long page_size;
if (!name)
return -EPERM;
+ page_size = sysconf(_SC_PAGE_SIZE);
+ if (page_size <= 0) {
+ return -ENOMEM;
+ }
/* Check that the subbuffer size is larger than a page. */
- if (subbuf_size < PAGE_SIZE)
+ if (subbuf_size < page_size)
return -EINVAL;
/*
num_subbuf_alloc = num_subbuf + 1;
shmsize += offset_align(shmsize, __alignof__(struct lttng_ust_lib_ring_buffer_backend_pages_shmp));
shmsize += sizeof(struct lttng_ust_lib_ring_buffer_backend_pages_shmp) * num_subbuf_alloc;
- shmsize += offset_align(shmsize, PAGE_SIZE);
+ shmsize += offset_align(shmsize, page_size);
shmsize += subbuf_size * num_subbuf_alloc;
shmsize += offset_align(shmsize, __alignof__(struct lttng_ust_lib_ring_buffer_backend_pages));
shmsize += sizeof(struct lttng_ust_lib_ring_buffer_backend_pages) * num_subbuf_alloc;
ssize_t orig_len;
struct lttng_ust_lib_ring_buffer_backend_pages_shmp *rpages;
unsigned long sb_bindex, id;
+ void *src;
orig_len = len;
offset &= chanb->buf_size - 1;
CHAN_WARN_ON(chanb, offset >= chanb->buf_size);
CHAN_WARN_ON(chanb, config->mode == RING_BUFFER_OVERWRITE
&& subbuffer_id_is_noref(config, id));
- memcpy(dest, shmp_index(handle, shmp(handle, rpages->shmp)->p, offset & (chanb->subbuf_size - 1)), len);
+ src = shmp_index(handle, shmp(handle, rpages->shmp)->p,
+ offset & (chanb->subbuf_size - 1));
+ if (caa_unlikely(!src))
+ return 0;
+ memcpy(dest, src, len);
return orig_len;
}
CHAN_WARN_ON(chanb, config->mode == RING_BUFFER_OVERWRITE
&& subbuffer_id_is_noref(config, id));
str = shmp_index(handle, shmp(handle, rpages->shmp)->p, offset & (chanb->subbuf_size - 1));
+ if (caa_unlikely(!str))
+ return -EINVAL;
string_len = strnlen(str, len);
if (dest && len) {
memcpy(dest, str, string_len);