kconsumerd: fix strict aliasing
[lttng-tools.git] / liblttngkconsumerd / lttngkconsumerd.c
index 78291d56bff917d138ad1a84240744a6a477efc8..1893e0ae66a2f110150b7e6aa219d32771c0b0c6 100644 (file)
@@ -245,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);
@@ -298,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;
@@ -775,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;
@@ -869,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;
@@ -997,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.023617 seconds and 4 git commands to generate.