X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Fbuffer-view.c;h=04bd1ca354f5555b4b78063ba523684cd93b52c2;hp=4e84b0335eccee4b3a6c786f6014b07a1be4dd01;hb=df62dbcd26798ca35926f8316a1b5734e825b84b;hpb=ff28f8657b7eafa590f914e85dcd30935244cc97 diff --git a/src/common/buffer-view.c b/src/common/buffer-view.c index 4e84b0335..04bd1ca35 100644 --- a/src/common/buffer-view.c +++ b/src/common/buffer-view.c @@ -1,18 +1,8 @@ /* - * Copyright (C) 2017 - Jérémie Galarneau + * Copyright (C) 2017 Jérémie Galarneau * - * This program is free software; you can redistribute it and/or modify it - * under the terms of the GNU Lesser General Public License, version 2.1 only, - * as published by the Free Software Foundation. + * SPDX-License-Identifier: LGPL-2.1-only * - * This program 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 program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #include @@ -20,6 +10,20 @@ #include #include +LTTNG_HIDDEN +struct lttng_buffer_view lttng_buffer_view_init( + const char *src, size_t offset, ptrdiff_t len) +{ + struct lttng_buffer_view view = { .data = src + offset, .size = len }; + return view; +} + +LTTNG_HIDDEN +bool lttng_buffer_view_is_valid(const struct lttng_buffer_view *view) +{ + return view && view->data && view->size > 0; +} + LTTNG_HIDDEN struct lttng_buffer_view lttng_buffer_view_from_view( const struct lttng_buffer_view *src, size_t offset, @@ -30,12 +34,14 @@ struct lttng_buffer_view lttng_buffer_view_from_view( assert(src); if (offset > src->size) { - ERR("Attempt to create buffer view with invalid offset"); + ERR("Attempt to create buffer view from another view with invalid offset (offset > source size): source size = %zu, offset in source = %zu, length = %zd", + src->size, offset, len); goto end; } if (len != -1 && len > (src->size - offset)) { - ERR("Attempt to create buffer view with invalid length"); + ERR("Attempt to create buffer view from another view with invalid length (length > space left after offset in source): source size = %zu, offset in source = %zu, length = %zd", + src->size, offset, len); goto end; } @@ -55,12 +61,14 @@ struct lttng_buffer_view lttng_buffer_view_from_dynamic_buffer( assert(src); if (offset > src->size) { - ERR("Attempt to create buffer view with invalid offset"); + ERR("Attempt to create buffer view from a dynamic buffer with invalid offset (offset > source size): source size = %zu, offset in source = %zu, length = %zd", + src->size, offset, len); goto end; } if (len != -1 && len > (src->size - offset)) { - ERR("Attempt to create buffer view with invalid length"); + ERR("Attempt to create buffer view from a dynamic buffer with invalid length (length > space left after offset in source): source size = %zu, offset in source = %zu, length = %zd", + src->size, offset, len); goto end; } @@ -69,3 +77,45 @@ struct lttng_buffer_view lttng_buffer_view_from_dynamic_buffer( end: return view; } + +LTTNG_HIDDEN +bool lttng_buffer_view_contains_string(const struct lttng_buffer_view *buf, + const char *str, + size_t len_with_null_terminator) +{ + const char *past_buf_end; + size_t max_str_len_with_null_terminator; + size_t str_len; + bool ret; + + past_buf_end = buf->data + buf->size; + + /* Is the start of the string in the buffer view? */ + if (str < buf->data || str >= past_buf_end) { + ret = false; + goto end; + } + + /* + * Max length the string could have to fit in the buffer, including + * NULL terminator. + */ + max_str_len_with_null_terminator = past_buf_end - str; + + /* Could the string even fit in the buffer? */ + if (len_with_null_terminator > max_str_len_with_null_terminator) { + ret = false; + goto end; + } + + str_len = lttng_strnlen(str, max_str_len_with_null_terminator); + if (str_len != (len_with_null_terminator - 1)) { + ret = false; + goto end; + } + + ret = true; + +end: + return ret; +}