Fix: unchecked buffer size for communication header
[lttng-tools.git] / src / common / session-consumed-size.c
index 6ba64249d8cf77566eb4c0be9a072100df4c9403..e147d1e5ffcf0536d8e7b32595b39ce9be0f042e 100644 (file)
@@ -1,18 +1,8 @@
 /*
- * Copyright (C) 2017 Jérémie Galarneau <jeremie.galarneau@efficios.com>
+ * Copyright (C) 2017 Jérémie Galarneau <jeremie.galarneau@efficios.com>
  *
- * This library 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 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
  */
 
 #include <lttng/condition/condition-internal.h>
@@ -75,7 +65,7 @@ end:
 static
 int lttng_condition_session_consumed_size_serialize(
                const struct lttng_condition *condition,
-               struct lttng_dynamic_buffer *buf)
+               struct lttng_payload *payload)
 {
        int ret;
        size_t session_name_len;
@@ -102,12 +92,13 @@ int lttng_condition_session_consumed_size_serialize(
                        consumed->consumed_threshold_bytes.value;
        consumed_comm.session_name_len = (uint32_t) session_name_len;
 
-       ret = lttng_dynamic_buffer_append(buf, &consumed_comm,
+       ret = lttng_dynamic_buffer_append(&payload->buffer, &consumed_comm,
                        sizeof(consumed_comm));
        if (ret) {
                goto end;
        }
-       ret = lttng_dynamic_buffer_append(buf, consumed->session_name,
+
+       ret = lttng_dynamic_buffer_append(&payload->buffer, consumed->session_name,
                        session_name_len);
        if (ret) {
                goto end;
@@ -165,24 +156,26 @@ struct lttng_condition *lttng_condition_session_consumed_size_create(void)
 }
 
 static
-ssize_t init_condition_from_buffer(struct lttng_condition *condition,
-               const struct lttng_buffer_view *src_view)
+ssize_t init_condition_from_payload(struct lttng_condition *condition,
+               struct lttng_payload_view *src_view)
 {
        ssize_t ret, condition_size;
        enum lttng_condition_status status;
-       const struct lttng_condition_session_consumed_size_comm *condition_comm;
        const char *session_name;
-       struct lttng_buffer_view names_view;
+       struct lttng_buffer_view session_name_view;
+       const struct lttng_condition_session_consumed_size_comm *condition_comm;
+       struct lttng_payload_view condition_comm_view = lttng_payload_view_from_view(
+                       src_view, 0, sizeof(*condition_comm));
 
-       if (src_view->size < sizeof(*condition_comm)) {
+       if (!lttng_payload_view_is_valid(&condition_comm_view)) {
                ERR("Failed to initialize from malformed condition buffer: buffer too short to contain header");
                ret = -1;
                goto end;
        }
 
-       condition_comm = (const struct lttng_condition_session_consumed_size_comm *) src_view->data;
-       names_view = lttng_buffer_view_from_view(src_view,
-                       sizeof(*condition_comm), -1);
+       condition_comm = (typeof(condition_comm)) condition_comm_view.buffer.data;
+       session_name_view = lttng_buffer_view_from_view(&src_view->buffer,
+                       sizeof(*condition_comm), condition_comm->session_name_len);
 
        if (condition_comm->session_name_len > LTTNG_NAME_MAX) {
                ERR("Failed to initialize from malformed condition buffer: name exceeds LTTNG_MAX_NAME");
@@ -190,7 +183,7 @@ ssize_t init_condition_from_buffer(struct lttng_condition *condition,
                goto end;
        }
 
-       if (names_view.size < condition_comm->session_name_len) {
+       if (!lttng_buffer_view_is_valid(&session_name_view)) {
                ERR("Failed to initialize from malformed condition buffer: buffer too short to contain element names");
                ret = -1;
                goto end;
@@ -204,7 +197,7 @@ ssize_t init_condition_from_buffer(struct lttng_condition *condition,
                goto end;
        }
 
-       session_name = names_view.data;
+       session_name = session_name_view.data;
        if (*(session_name + condition_comm->session_name_len - 1) != '\0') {
                ERR("Malformed session name encountered in condition buffer");
                ret = -1;
@@ -232,8 +225,8 @@ end:
 }
 
 LTTNG_HIDDEN
-ssize_t lttng_condition_session_consumed_size_create_from_buffer(
-               const struct lttng_buffer_view *view,
+ssize_t lttng_condition_session_consumed_size_create_from_payload(
+               struct lttng_payload_view *view,
                struct lttng_condition **_condition)
 {
        ssize_t ret;
@@ -245,7 +238,7 @@ ssize_t lttng_condition_session_consumed_size_create_from_buffer(
                goto error;
        }
 
-       ret = init_condition_from_buffer(condition, view);
+       ret = init_condition_from_payload(condition, view);
        if (ret < 0) {
                goto error;
        }
@@ -258,14 +251,14 @@ error:
 }
 
 static
-struct lttng_evaluation *create_evaluation_from_buffer(
-               const struct lttng_buffer_view *view)
+struct lttng_evaluation *create_evaluation_from_payload(
+               const struct lttng_payload_view *view)
 {
        const struct lttng_evaluation_session_consumed_size_comm *comm =
-                       (const struct lttng_evaluation_session_consumed_size_comm *) view->data;
+                       (typeof(comm)) view->buffer.data;
        struct lttng_evaluation *evaluation = NULL;
 
-       if (view->size < sizeof(*comm)) {
+       if (view->buffer.size < sizeof(*comm)) {
                goto end;
        }
 
@@ -276,8 +269,8 @@ end:
 }
 
 LTTNG_HIDDEN
-ssize_t lttng_evaluation_session_consumed_size_create_from_buffer(
-               const struct lttng_buffer_view *view,
+ssize_t lttng_evaluation_session_consumed_size_create_from_payload(
+               struct lttng_payload_view *view,
                struct lttng_evaluation **_evaluation)
 {
        ssize_t ret;
@@ -288,7 +281,7 @@ ssize_t lttng_evaluation_session_consumed_size_create_from_buffer(
                goto error;
        }
 
-       evaluation = create_evaluation_from_buffer(view);
+       evaluation = create_evaluation_from_payload(view);
        if (!evaluation) {
                ret = -1;
                goto error;
@@ -403,15 +396,16 @@ end:
 static
 int lttng_evaluation_session_consumed_size_serialize(
                const struct lttng_evaluation *evaluation,
-               struct lttng_dynamic_buffer *buf)
+               struct lttng_payload *payload)
 {
        struct lttng_evaluation_session_consumed_size *consumed;
        struct lttng_evaluation_session_consumed_size_comm comm;
 
-       consumed = container_of(evaluation, struct lttng_evaluation_session_consumed_size,
-                       parent);
+       consumed = container_of(evaluation,
+                       struct lttng_evaluation_session_consumed_size, parent);
        comm.session_consumed = consumed->session_consumed;
-       return lttng_dynamic_buffer_append(buf, &comm, sizeof(comm));
+       return lttng_dynamic_buffer_append(
+                       &payload->buffer, &comm, sizeof(comm));
 }
 
 static
This page took 0.025631 seconds and 4 git commands to generate.