lttng-ctl: fix: possible unaligned access in packed structure
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Sat, 14 Sep 2019 19:51:32 +0000 (15:51 -0400)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Sat, 14 Sep 2019 20:33:48 +0000 (16:33 -0400)
Wrap all lttng_domain copies with COPY_DOMAIN_PACKED which copies the
source domain to a temporary destination (on stack) and then assign
this temporary domain to the destination domain. This ensures the
compiler generates the code needed to perform the unaligned accesses
to the domain.

Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
src/lib/lttng-ctl/lttng-ctl.c

index 9e709c1b6e4157f9072838d3fdbc8f779ed63cda..79644ceed79ae55c7c543de9d0a2af8e680f08bd 100644 (file)
@@ -67,6 +67,13 @@ do {                                                         \
 } while (0)
 #endif
 
+#define COPY_DOMAIN_PACKED(dst, src)                           \
+do {                                                           \
+       struct lttng_domain _tmp_domain;                        \
+                                                               \
+       lttng_ctl_copy_lttng_domain(&_tmp_domain, &src);        \
+       dst = _tmp_domain;                                      \
+} while (0)
 
 /* Socket to session daemon for communication */
 static int sessiond_socket = -1;
@@ -653,7 +660,7 @@ int lttng_register_consumer(struct lttng_handle *handle,
        lsm.cmd_type = LTTNG_REGISTER_CONSUMER;
        lttng_ctl_copy_string(lsm.session.name, handle->session_name,
                        sizeof(lsm.session.name));
-       lttng_ctl_copy_lttng_domain(&lsm.domain, &handle->domain);
+       COPY_DOMAIN_PACKED(lsm.domain, handle->domain);
 
        lttng_ctl_copy_string(lsm.u.reg.path, socket_path,
                        sizeof(lsm.u.reg.path));
@@ -784,7 +791,7 @@ int lttng_add_context(struct lttng_handle *handle,
                                sizeof(lsm.u.context.channel_name));
        }
 
-       lttng_ctl_copy_lttng_domain(&lsm.domain, &handle->domain);
+       COPY_DOMAIN_PACKED(lsm.domain, handle->domain);
        lttng_ctl_copy_string(lsm.session.name, handle->session_name,
                        sizeof(lsm.session.name));
 
@@ -1124,8 +1131,7 @@ int lttng_enable_event_with_exclusions(struct lttng_handle *handle,
                lttng_ctl_copy_string(ev->name, "*", sizeof(ev->name));
        }
 
-       lttng_ctl_copy_lttng_domain(&lsm.domain, &handle->domain);
-       /* FIXME: copying non-packed struct to packed struct. */
+       COPY_DOMAIN_PACKED(lsm.domain, handle->domain);
        memcpy(&lsm.u.enable.event, ev, sizeof(lsm.u.enable.event));
 
        lttng_ctl_copy_string(lsm.session.name, handle->session_name,
@@ -1318,8 +1324,7 @@ int lttng_disable_event_ext(struct lttng_handle *handle,
 
        lsm.cmd_type = LTTNG_DISABLE_EVENT;
 
-       lttng_ctl_copy_lttng_domain(&lsm.domain, &handle->domain);
-       /* FIXME: copying non-packed struct to packed struct. */
+       COPY_DOMAIN_PACKED(lsm.domain, handle->domain);
        memcpy(&lsm.u.disable.event, ev, sizeof(lsm.u.disable.event));
 
        lttng_ctl_copy_string(lsm.session.name, handle->session_name,
@@ -1565,7 +1570,7 @@ int lttng_enable_channel(struct lttng_handle *handle,
        }
 
        lsm.cmd_type = LTTNG_ENABLE_CHANNEL;
-       lttng_ctl_copy_lttng_domain(&lsm.domain, &handle->domain);
+       COPY_DOMAIN_PACKED(lsm.domain, handle->domain);
 
        lttng_ctl_copy_string(lsm.session.name, handle->session_name,
                        sizeof(lsm.session.name));
@@ -1593,7 +1598,7 @@ int lttng_disable_channel(struct lttng_handle *handle, const char *name)
        lttng_ctl_copy_string(lsm.u.disable.channel_name, name,
                        sizeof(lsm.u.disable.channel_name));
 
-       lttng_ctl_copy_lttng_domain(&lsm.domain, &handle->domain);
+       COPY_DOMAIN_PACKED(lsm.domain, handle->domain);
 
        lttng_ctl_copy_string(lsm.session.name, handle->session_name,
                        sizeof(lsm.session.name));
@@ -1619,7 +1624,7 @@ int lttng_track_pid(struct lttng_handle *handle, int pid)
        lsm.cmd_type = LTTNG_TRACK_PID;
        lsm.u.pid_tracker.pid = pid;
 
-       lttng_ctl_copy_lttng_domain(&lsm.domain, &handle->domain);
+       COPY_DOMAIN_PACKED(lsm.domain, handle->domain);
 
        lttng_ctl_copy_string(lsm.session.name, handle->session_name,
                        sizeof(lsm.session.name));
@@ -1645,7 +1650,7 @@ int lttng_untrack_pid(struct lttng_handle *handle, int pid)
        lsm.cmd_type = LTTNG_UNTRACK_PID;
        lsm.u.pid_tracker.pid = pid;
 
-       lttng_ctl_copy_lttng_domain(&lsm.domain, &handle->domain);
+       COPY_DOMAIN_PACKED(lsm.domain, handle->domain);
 
        lttng_ctl_copy_string(lsm.session.name, handle->session_name,
                        sizeof(lsm.session.name));
@@ -1671,7 +1676,7 @@ int lttng_list_tracepoints(struct lttng_handle *handle,
 
        memset(&lsm, 0, sizeof(lsm));
        lsm.cmd_type = LTTNG_LIST_TRACEPOINTS;
-       lttng_ctl_copy_lttng_domain(&lsm.domain, &handle->domain);
+       COPY_DOMAIN_PACKED(lsm.domain, handle->domain);
 
        ret = lttng_ctl_ask_sessiond(&lsm, (void **) events);
        if (ret < 0) {
@@ -1699,7 +1704,7 @@ int lttng_list_tracepoint_fields(struct lttng_handle *handle,
 
        memset(&lsm, 0, sizeof(lsm));
        lsm.cmd_type = LTTNG_LIST_TRACEPOINT_FIELDS;
-       lttng_ctl_copy_lttng_domain(&lsm.domain, &handle->domain);
+       COPY_DOMAIN_PACKED(lsm.domain, handle->domain);
 
        ret = lttng_ctl_ask_sessiond(&lsm, (void **) fields);
        if (ret < 0) {
@@ -2201,7 +2206,7 @@ int lttng_list_channels(struct lttng_handle *handle,
        lttng_ctl_copy_string(lsm.session.name, handle->session_name,
                        sizeof(lsm.session.name));
 
-       lttng_ctl_copy_lttng_domain(&lsm.domain, &handle->domain);
+       COPY_DOMAIN_PACKED(lsm.domain, handle->domain);
 
        ret = lttng_ctl_ask_sessiond(&lsm, (void**) channels);
        if (ret < 0) {
@@ -2261,7 +2266,7 @@ int lttng_list_events(struct lttng_handle *handle,
                        sizeof(lsm.session.name));
        lttng_ctl_copy_string(lsm.u.list.channel_name, channel_name,
                        sizeof(lsm.u.list.channel_name));
-       lttng_ctl_copy_lttng_domain(&lsm.domain, &handle->domain);
+       COPY_DOMAIN_PACKED(lsm.domain, handle->domain);
 
        ret = lttng_ctl_ask_sessiond_fds_varlen(&lsm, NULL, 0, NULL, 0,
                (void **) &reception_buffer, (void **) &cmd_header,
@@ -2788,7 +2793,7 @@ int lttng_set_consumer_url(struct lttng_handle *handle,
 
        lttng_ctl_copy_string(lsm.session.name, handle->session_name,
                        sizeof(lsm.session.name));
-       lttng_ctl_copy_lttng_domain(&lsm.domain, &handle->domain);
+       COPY_DOMAIN_PACKED(lsm.domain, handle->domain);
 
        size = uri_parse_str_urls(control_url, data_url, &uris);
        if (size < 0) {
@@ -2896,7 +2901,7 @@ int lttng_list_tracker_pids(struct lttng_handle *handle,
        lsm.cmd_type = LTTNG_LIST_TRACKER_PIDS;
        lttng_ctl_copy_string(lsm.session.name, handle->session_name,
                        sizeof(lsm.session.name));
-       lttng_ctl_copy_lttng_domain(&lsm.domain, &handle->domain);
+       COPY_DOMAIN_PACKED(lsm.domain, handle->domain);
 
        ret = lttng_ctl_ask_sessiond(&lsm, (void **) &pids);
        if (ret < 0) {
This page took 0.028717 seconds and 4 git commands to generate.