X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=libringbuffer%2Fring_buffer_backend.c;h=3db1f860f3918d8a1e61a959e1f4501678f93687;hb=2dac206d80667e378444e696850ffeef87385006;hp=e949a5e292d2048f306760f329f64d668a0c30cd;hpb=12bcbbdbd7eb6b3cb111ab91b316b14ac210ceb2;p=lttng-ust.git diff --git a/libringbuffer/ring_buffer_backend.c b/libringbuffer/ring_buffer_backend.c index e949a5e2..3db1f860 100644 --- a/libringbuffer/ring_buffer_backend.c +++ b/libringbuffer/ring_buffer_backend.c @@ -1,9 +1,21 @@ /* * ring_buffer_backend.c * - * Copyright (C) 2005-2010 - Mathieu Desnoyers + * Copyright (C) 2005-2012 Mathieu Desnoyers * - * Dual LGPL v2.1/GPL v2 license. + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; only + * version 2.1 of the License. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #define _GNU_SOURCE @@ -210,9 +222,6 @@ int channel_backend_init(struct channel_backend *chanb, if (!name) return -EPERM; - if (!(subbuf_size && num_subbuf)) - return -EPERM; - /* Check that the subbuffer size is larger than a page. */ if (subbuf_size < PAGE_SIZE) return -EINVAL; @@ -271,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)); @@ -289,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)); @@ -370,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) @@ -383,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;