Backport: lttng_buffer_view_is_valid, lttng_buffer_view_contains_string
authorJonathan Rajotte <jonathan.rajotte-julien@efficios.com>
Tue, 18 Jan 2022 14:46:48 +0000 (09:46 -0500)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Mon, 28 Feb 2022 22:11:59 +0000 (17:11 -0500)
Change-Id: I23892e6f20e2847037ba16ad1bba8b2d5a9e0a7c
Signed-off-by: Jonathan Rajotte <jonathan.rajotte-julien@efficios.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
src/common/buffer-view.c
src/common/buffer-view.h

index 4bdb1eb7d75d48be514689200954d69c44a7809b..7337dbb06156bc62a118fee12ce23a8887fadbaa 100644 (file)
@@ -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;
+}
index e8c351b3f994974a847bf4936812ad073b445ef4..c430a68ec4ccf7e66fac4f2c7c9bc95c4180baba 100644 (file)
@@ -11,6 +11,7 @@
 #include <stddef.h>
 #include <stdint.h>
 #include <common/macros.h>
+#include <stdbool.h>
 
 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 */
This page took 0.027821 seconds and 4 git commands to generate.