kconsumerd: fix strict aliasing
[lttng-tools.git] / liblttngkconsumerd / lttngkconsumerd.c
index 5c9f613b11eddf48e4450e0cfd304b00c54d27e6..1893e0ae66a2f110150b7e6aa219d32771c0b0c6 100644 (file)
@@ -18,6 +18,7 @@
  */
 
 #define _GNU_SOURCE
+#include <assert.h>
 #include <fcntl.h>
 #include <poll.h>
 #include <pthread.h>
 #include <sys/socket.h>
 #include <sys/types.h>
 #include <unistd.h>
-#include <urcu/list.h>
-#include <assert.h>
 
+#include <lttng-kernel-ctl.h>
+#include <lttng-sessiond-comm.h>
 #include <lttng/lttng-kconsumerd.h>
-
-#include "kernelctl.h"
-#include "lttngerr.h"
-#include "lttng-sessiond-comm.h"
+#include <lttngerr.h>
 
 static struct lttng_kconsumerd_global_data {
        /*
@@ -247,12 +245,16 @@ static int kconsumerd_consumerd_recv_fd(
                enum lttng_kconsumerd_command cmd_type)
 {
        struct iovec iov[1];
-       int ret = 0, i, tmp2;
+       int ret = 0, i, j, tmp2;
        struct cmsghdr *cmsg;
        int nb_fd;
        char recv_fd[CMSG_SPACE(sizeof(int))];
        struct lttcomm_kconsumerd_msg lkm;
        struct lttng_kconsumerd_fd *new_fd;
+       union {
+               unsigned char vc[4];
+               int vi;
+       } tmp;
 
        /* the number of fds we are about to receive */
        nb_fd = size / sizeof(struct lttcomm_kconsumerd_msg);
@@ -300,10 +302,10 @@ static int kconsumerd_consumerd_recv_fd(
                if (cmsg->cmsg_level == SOL_SOCKET && cmsg->cmsg_type == SCM_RIGHTS) {
                        switch (cmd_type) {
                                case ADD_STREAM:
-                                       DBG("kconsumerd_add_fd %s (%d)", lkm.path_name,
-                                                       ((int *) CMSG_DATA(cmsg))[0]);
-
-                                       new_fd = kconsumerd_allocate_fd(&lkm, ((int *) CMSG_DATA(cmsg))[0]);
+                                       for (j = 0; j < sizeof(int); j++)
+                                               tmp.vc[j] = CMSG_DATA(cmsg)[j];
+                                       DBG("kconsumerd_add_fd %s (%d)", lkm.path_name, tmp.vi);
+                                       new_fd = kconsumerd_allocate_fd(&lkm, tmp.vi);
                                        if (new_fd == NULL) {
                                                lttng_kconsumerd_send_error(ctx, KCONSUMERD_OUTFD_ERROR);
                                                goto end;
@@ -777,6 +779,7 @@ struct lttng_kconsumerd_local_data *lttng_kconsumerd_create(
                goto error;
        }
 
+       ctx->kconsumerd_error_socket = -1;
        /* assign the callbacks */
        ctx->on_buffer_ready = buffer_ready;
        ctx->on_recv_fd = recv_fd;
@@ -871,6 +874,7 @@ void *lttng_kconsumerd_thread_receive_fds(void *data)
 
        DBG("Sending ready command to ltt-sessiond");
        ret = lttng_kconsumerd_send_error(ctx, KCONSUMERD_COMMAND_SOCK_READY);
+       /* return < 0 on error, but == 0 is not fatal */
        if (ret < 0) {
                ERR("Error sending ready command to ltt-sessiond");
                goto end;
@@ -999,6 +1003,7 @@ void lttng_kconsumerd_should_exit(struct lttng_kconsumerd_local_data *ctx)
 
 /*
  * Send return code to the session daemon.
+ * If the socket is not defined, we return 0, it is not a fatal error
  */
 int lttng_kconsumerd_send_error(
                struct lttng_kconsumerd_local_data *ctx, int cmd)
This page took 0.023727 seconds and 4 git commands to generate.