s3: lib, s3: modules: Fix compilation on Solaris.
authorJeremy Allison <jra@samba.org>
Fri, 3 Oct 2014 16:24:04 +0000 (09:24 -0700)
committerAndreas Schneider <asn@cryptomilk.org>
Mon, 6 Oct 2014 10:33:35 +0000 (12:33 +0200)
Based on work from YOUZHONG YANG <youzhong@gmail.com>.
Code needs fixing when HAVE_STRUCT_MSGHDR_MSG_CONTROL is
not defined. Also Solaris doesn't have msg_flags field
(which we set to zero anyway, so if we initialize
the entire struct to zero, we never need to refer to it).

https://bugzilla.samba.org/show_bug.cgi?id=10849

Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
Autobuild-User(master): Andreas Schneider <asn@cryptomilk.org>
Autobuild-Date(master): Mon Oct  6 12:33:36 CEST 2014 on sn-devel-104

source3/lib/unix_msg/unix_msg.c
source3/modules/vfs_aio_fork.c

index 48700683831875c1bce96f19eaa4ae4b50915633..00ac7f52d3d531ebcd2825497898be70a01bf52c 100644 (file)
@@ -477,7 +477,7 @@ static int queue_msg(struct unix_dgram_send_queue *q,
        struct unix_dgram_msg *msg;
        ssize_t data_len;
        uint8_t *data_buf;
-       size_t msglen;
+       size_t msglen = sizeof(struct unix_dgram_msg);
        int i;
        size_t tmp;
        int ret = -1;
@@ -487,6 +487,13 @@ static int queue_msg(struct unix_dgram_send_queue *q,
        size_t cmsg_len = CMSG_LEN(fds_size);
        size_t cmsg_space = CMSG_SPACE(fds_size);
        char *cmsg_buf;
+
+       /*
+        * Note: No need to check for overflow here,
+        * since cmsg will store <= INT8_MAX fds.
+        */
+       msglen += cmsg_space;
+
 #endif /*  HAVE_STRUCT_MSGHDR_MSG_CONTROL */
 
        if (num_fds > INT8_MAX) {
@@ -499,14 +506,6 @@ static int queue_msg(struct unix_dgram_send_queue *q,
        }
 #endif
 
-       msglen = sizeof(struct unix_dgram_msg);
-
-       /*
-        * Note: No need to check for overflow here,
-        * since cmsg will store <= INT8_MAX fds.
-        */
-       msglen += cmsg_space;
-
        data_len = iov_buflen(iov, iovlen);
        if (data_len == -1) {
                return EINVAL;
@@ -593,7 +592,9 @@ static int queue_msg(struct unix_dgram_send_queue *q,
        return 0;
 
 fail:
+#ifdef HAVE_STRUCT_MSGHDR_MSG_CONTROL
        close_fd_array(fds_copy, num_fds);
+#endif
        return ret;
 }
 
index c1bded98c5359ce6b1d51ca121cb3935a891af87..12e6f8025794aec991652fd75436fde0686ff2c8 100644 (file)
@@ -157,6 +157,7 @@ static ssize_t read_fd(int fd, void *ptr, size_t nbytes, int *recvfd)
 #ifndef HAVE_STRUCT_MSGHDR_MSG_CONTROL
        int newfd;
 
+       ZERO_STRUCT(msg);
        msg.msg_accrights = (caddr_t) &newfd;
        msg.msg_accrightslen = sizeof(int);
 #else
@@ -167,13 +168,15 @@ static ssize_t read_fd(int fd, void *ptr, size_t nbytes, int *recvfd)
        } control_un;
        struct cmsghdr  *cmptr;
 
+       ZERO_STRUCT(msg);
+       ZERO_STRUCT(control_un);
+
        msg.msg_control = control_un.control;
        msg.msg_controllen = sizeof(control_un.control);
 #endif
 
        msg.msg_name = NULL;
        msg.msg_namelen = 0;
-       msg.msg_flags = 0;
 
        iov[0].iov_base = (void *)ptr;
        iov[0].iov_len = nbytes;