From 179ad61c39b5164f2b9f48f355fc1ad3ec73c8a4 Mon Sep 17 00:00:00 2001 From: Jonathan Rajotte Date: Tue, 18 Jan 2022 09:46:48 -0500 Subject: [PATCH] Backport: lttng_buffer_view_is_valid, lttng_buffer_view_contains_string MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Change-Id: I23892e6f20e2847037ba16ad1bba8b2d5a9e0a7c Signed-off-by: Jonathan Rajotte Signed-off-by: Jérémie Galarneau --- src/common/buffer-view.c | 48 ++++++++++++++++++++++++++++++++++++++++ src/common/buffer-view.h | 25 +++++++++++++++++++++ 2 files changed, 73 insertions(+) diff --git a/src/common/buffer-view.c b/src/common/buffer-view.c index 4bdb1eb7d..7337dbb06 100644 --- a/src/common/buffer-view.c +++ b/src/common/buffer-view.c @@ -18,6 +18,12 @@ struct lttng_buffer_view lttng_buffer_view_init( 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, @@ -67,3 +73,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; +} diff --git a/src/common/buffer-view.h b/src/common/buffer-view.h index e8c351b3f..c430a68ec 100644 --- a/src/common/buffer-view.h +++ b/src/common/buffer-view.h @@ -11,6 +11,7 @@ #include #include #include +#include struct lttng_dynamic_buffer; @@ -34,6 +35,17 @@ LTTNG_HIDDEN struct lttng_buffer_view lttng_buffer_view_init( const char *src, size_t offset, ptrdiff_t len); +/** + * Checks if a buffer view is safe to access. + * + * After calling the buffer view creation functions, callers should verify + * if the resquested length (if any is explicitly provided) could be mapped + * to a new view. + * + * @view Buffer view to validate + */ +bool lttng_buffer_view_is_valid(const struct lttng_buffer_view *view); + /** * Return a buffer view referencing a subset of the memory referenced by another * view. @@ -70,4 +82,17 @@ struct lttng_buffer_view lttng_buffer_view_from_dynamic_buffer( const struct lttng_dynamic_buffer *src, size_t offset, ptrdiff_t len); +/** + * Verify that `buf` contains a string starting at `str` of length + * `len_with_null_terminator`. + * + * @buf The buffer view + * @str The start of the string + * @len_with_null_terminator Expected length of the string, including the + * NULL terminator. + */ +bool lttng_buffer_view_contains_string(const struct lttng_buffer_view *buf, + const char *str, + size_t len_with_null_terminator); + #endif /* LTTNG_BUFFER_VIEW_H */ -- 2.34.1