Fix: liblttng-ctl: non-packed structure used for tracker serialization
[lttng-tools.git] / src / common / tracker.c
index 532a924b56a772b3d55d11e611028ebf7267a7fe..734fbd3093e273702860fd488e9a548d8c8b9dfe 100644 (file)
@@ -20,7 +20,7 @@
 
 struct process_attr_tracker_values_comm_header {
        uint32_t count;
-};
+} LTTNG_PACKED;
 
 struct process_attr_tracker_value_comm {
        /* enum lttng_process_attr_value_type */
@@ -30,7 +30,7 @@ struct process_attr_tracker_value_comm {
                /* Includes the '\0' terminator. */
                uint32_t name_len;
        } value;
-};
+} LTTNG_PACKED;
 
 #define GET_INTEGRAL_COMM_VALUE(value_ptr, as_type)              \
        ((as_type)(is_signed(as_type) ? (value_ptr)->u._signed : \
@@ -85,6 +85,7 @@ enum lttng_error_code process_attr_value_from_comm(
                name = strdup(value_view->data);
                if (!name) {
                        ret = LTTNG_ERR_NOMEM;
+                       goto error;
                }
        }
 
@@ -102,10 +103,12 @@ enum lttng_error_code process_attr_value_from_comm(
        }
 
        /* Only expect a payload for name value types. */
-       if (is_value_type_name(value_type) && value_view->size == 0) {
+       if (is_value_type_name(value_type) &&
+                       (!value_view || value_view->size == 0)) {
                ret = LTTNG_ERR_INVALID_PROTOCOL;
                goto error;
-       } else if (!is_value_type_name(value_type) && value_view->size != 0) {
+       } else if (!is_value_type_name(value_type) && value_view &&
+                       value_view->size != 0) {
                ret = LTTNG_ERR_INVALID_PROTOCOL;
                goto error;
        }
@@ -173,6 +176,7 @@ enum lttng_error_code process_attr_value_from_comm(
 
        *_value = value;
        value = NULL;
+       free(name);
        return LTTNG_OK;
 error:
        free(name);
This page took 0.025879 seconds and 4 git commands to generate.