The branch, v3-5-test has been updated
       via  109e407... tsocket_bsd: Always use a real length for the 
sa_socklen, and keep it around
       via  e96605d... tsocket: only copy the specific part of sockaddr*
       via  e9f7d27... tsocket: allow AF_UNIX sockaddrs smaller than 
sizeof(sockaddr_un)
      from  47e2bd2... s3:configure: use correct SONAMEFLAG on Solaris 
depending on which linker is being used (cherry picked from commit 
358a3855c20153d7fe742ca2e6b9bd8a9c92e525)

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=v3-5-test


- Log -----------------------------------------------------------------
commit 109e407554c55a602b0c184eb7eec2ed1833b68b
Author: Andrew Bartlett <[email protected]>
Date:   Wed Apr 7 10:42:37 2010 +1000

    tsocket_bsd: Always use a real length for the sa_socklen, and keep it around
    
    The previous code assumed the OS would happily accept sizeof(struct
    sockaddr_storage).  It seems some versions of Solaris do not like
    this.
    
    Andrew Bartlett
    (cherry picked from commit f1aa4c34bf0bd7d42627024af333963b741babea)
    
    Fix for bug #7354.
    
    Signed-off-by: Stefan Metzmacher <[email protected]>

commit e96605da78f1a0afbaf3b0aedaf7a4730d64d3a5
Author: Stefan Metzmacher <[email protected]>
Date:   Wed Dec 23 19:34:32 2009 +0100

    tsocket: only copy the specific part of sockaddr*
    
    This makes sure we fill the unspefic bytes with 0
    and have zero termination for sockaddr_un.
    
    metze
    (cherry picked from commit 17c804a67593cdb4d8646b5be6b50fddf56b3e27)
    
    Signed-off-by: Stefan Metzmacher <[email protected]>

commit e9f7d271e2a96d5dbce63bc454c68930cbc52d62
Author: Stefan Metzmacher <[email protected]>
Date:   Wed Dec 23 19:31:41 2009 +0100

    tsocket: allow AF_UNIX sockaddrs smaller than sizeof(sockaddr_un)
    
    This is needed as getpeername() truncates the length to 2 if the
    peer socket has no name.
    
    metze
    (cherry picked from commit 4784c8c3bea98592486ca973d57c99671eb68cb2)
    
    Signed-off-by: Stefan Metzmacher <[email protected]>

-----------------------------------------------------------------------

Summary of changes:
 lib/tsocket/tsocket_bsd.c |   96 ++++++++++++---------------------------------
 1 files changed, 25 insertions(+), 71 deletions(-)


Changeset truncated at 500 lines:

diff --git a/lib/tsocket/tsocket_bsd.c b/lib/tsocket/tsocket_bsd.c
index 201788e..43defb3 100644
--- a/lib/tsocket/tsocket_bsd.c
+++ b/lib/tsocket/tsocket_bsd.c
@@ -190,6 +190,7 @@ static ssize_t tsocket_bsd_pending(int fd)
 static const struct tsocket_address_ops tsocket_address_bsd_ops;
 
 struct tsocket_address_bsd {
+       socklen_t sa_socklen;
        union {
                struct sockaddr sa;
                struct sockaddr_in in;
@@ -210,11 +211,15 @@ int _tsocket_address_bsd_from_sockaddr(TALLOC_CTX 
*mem_ctx,
        struct tsocket_address *addr;
        struct tsocket_address_bsd *bsda;
 
+       if (sa_socklen < sizeof(sa->sa_family)) {
+               errno = EINVAL;
+               return -1;
+       }
+
        switch (sa->sa_family) {
        case AF_UNIX:
-               if (sa_socklen < sizeof(struct sockaddr_un)) {
-                       errno = EINVAL;
-                       return -1;
+               if (sa_socklen > sizeof(struct sockaddr_un)) {
+                       sa_socklen = sizeof(struct sockaddr_un);
                }
                break;
        case AF_INET:
@@ -222,6 +227,7 @@ int _tsocket_address_bsd_from_sockaddr(TALLOC_CTX *mem_ctx,
                        errno = EINVAL;
                        return -1;
                }
+               sa_socklen = sizeof(struct sockaddr_in);
                break;
 #ifdef HAVE_IPV6
        case AF_INET6:
@@ -229,6 +235,7 @@ int _tsocket_address_bsd_from_sockaddr(TALLOC_CTX *mem_ctx,
                        errno = EINVAL;
                        return -1;
                }
+               sa_socklen = sizeof(struct sockaddr_in6);
                break;
 #endif
        default:
@@ -255,6 +262,8 @@ int _tsocket_address_bsd_from_sockaddr(TALLOC_CTX *mem_ctx,
 
        memcpy(&bsda->u.ss, sa, sa_socklen);
 
+       bsda->sa_socklen = sa_socklen;
+
        *_addr = addr;
        return 0;
 }
@@ -265,42 +274,24 @@ ssize_t tsocket_address_bsd_sockaddr(const struct 
tsocket_address *addr,
 {
        struct tsocket_address_bsd *bsda = talloc_get_type(addr->private_data,
                                           struct tsocket_address_bsd);
-       ssize_t rlen = 0;
 
        if (!bsda) {
                errno = EINVAL;
                return -1;
        }
 
-       switch (bsda->u.sa.sa_family) {
-       case AF_UNIX:
-               rlen = sizeof(struct sockaddr_un);
-               break;
-       case AF_INET:
-               rlen = sizeof(struct sockaddr_in);
-               break;
-#ifdef HAVE_IPV6
-       case AF_INET6:
-               rlen = sizeof(struct sockaddr_in6);
-               break;
-#endif
-       default:
-               errno = EAFNOSUPPORT;
-               return -1;
-       }
-
-       if (sa_socklen < rlen) {
+       if (sa_socklen < bsda->sa_socklen) {
                errno = EINVAL;
                return -1;
        }
 
-       if (sa_socklen > sizeof(struct sockaddr_storage)) {
+       if (sa_socklen > bsda->sa_socklen) {
                memset(sa, 0, sa_socklen);
-               sa_socklen = sizeof(struct sockaddr_storage);
+               sa_socklen = bsda->sa_socklen;
        }
 
        memcpy(sa, &bsda->u.ss, sa_socklen);
-       return rlen;
+       return sa_socklen;
 }
 
 int _tsocket_address_inet_from_strings(TALLOC_CTX *mem_ctx,
@@ -582,7 +573,7 @@ static struct tsocket_address 
*tsocket_address_bsd_copy(const struct tsocket_add
 
        ret = _tsocket_address_bsd_from_sockaddr(mem_ctx,
                                                 &bsda->u.sa,
-                                                sizeof(bsda->u.ss),
+                                                bsda->sa_socklen,
                                                 &copy,
                                                 location);
        if (ret != 0) {
@@ -821,8 +812,6 @@ static void tdgram_bsd_recvfrom_handler(void *private_data)
        struct tdgram_bsd *bsds = tdgram_context_data(dgram, struct tdgram_bsd);
        struct tsocket_address_bsd *bsda;
        ssize_t ret;
-       struct sockaddr *sa = NULL;
-       socklen_t sa_socklen = 0;
        int err;
        bool retry;
 
@@ -856,18 +845,10 @@ static void tdgram_bsd_recvfrom_handler(void 
*private_data)
        }
 
        ZERO_STRUCTP(bsda);
+       bsda->sa_socklen = sizeof(bsda->u.ss);
 
-       sa = &bsda->u.sa;
-       sa_socklen = sizeof(bsda->u.ss);
-       /*
-        * for unix sockets we can't use the size of sockaddr_storage
-        * we would get EINVAL
-        */
-       if (bsda->u.sa.sa_family == AF_UNIX) {
-               sa_socklen = sizeof(bsda->u.un);
-       }
-
-       ret = recvfrom(bsds->fd, state->buf, state->len, 0, sa, &sa_socklen);
+       ret = recvfrom(bsds->fd, state->buf, state->len, 0,
+                      &bsda->u.sa, &bsda->sa_socklen);
        err = tsocket_bsd_error_from_errno(ret, errno, &retry);
        if (retry) {
                /* retry later */
@@ -1013,14 +994,7 @@ static void tdgram_bsd_sendto_handler(void *private_data)
                        struct tsocket_address_bsd);
 
                sa = &bsda->u.sa;
-               sa_socklen = sizeof(bsda->u.ss);
-               /*
-                * for unix sockets we can't use the size of sockaddr_storage
-                * we would get EINVAL
-                */
-               if (bsda->u.sa.sa_family == AF_UNIX) {
-                       sa_socklen = sizeof(bsda->u.un);
-               }
+               sa_socklen = bsda->sa_socklen;
        }
 
        ret = sendto(bsds->fd, state->buf, state->len, 0, sa, sa_socklen);
@@ -1146,7 +1120,6 @@ static int tdgram_bsd_dgram_socket(const struct 
tsocket_address *local,
        bool do_ipv6only = false;
        bool is_inet = false;
        int sa_fam = lbsda->u.sa.sa_family;
-       socklen_t sa_socklen = sizeof(lbsda->u.ss);
 
        if (remote) {
                rbsda = talloc_get_type_abort(remote->private_data,
@@ -1163,11 +1136,6 @@ static int tdgram_bsd_dgram_socket(const struct 
tsocket_address *local,
                        do_reuseaddr = true;
                        do_bind = true;
                }
-               /*
-                * for unix sockets we can't use the size of sockaddr_storage
-                * we would get EINVAL
-                */
-               sa_socklen = sizeof(lbsda->u.un);
                break;
        case AF_INET:
                if (lbsda->u.in.sin_port != 0) {
@@ -1178,7 +1146,6 @@ static int tdgram_bsd_dgram_socket(const struct 
tsocket_address *local,
                        do_bind = true;
                }
                is_inet = true;
-               sa_socklen = sizeof(rbsda->u.in);
                break;
 #ifdef HAVE_IPV6
        case AF_INET6:
@@ -1192,7 +1159,6 @@ static int tdgram_bsd_dgram_socket(const struct 
tsocket_address *local,
                        do_bind = true;
                }
                is_inet = true;
-               sa_socklen = sizeof(rbsda->u.in6);
                do_ipv6only = true;
                break;
 #endif
@@ -1205,12 +1171,10 @@ static int tdgram_bsd_dgram_socket(const struct 
tsocket_address *local,
                sa_fam = rbsda->u.sa.sa_family;
                switch (sa_fam) {
                case AF_INET:
-                       sa_socklen = sizeof(rbsda->u.in);
                        do_ipv6only = false;
                        break;
 #ifdef HAVE_IPV6
                case AF_INET6:
-                       sa_socklen = sizeof(rbsda->u.in6);
                        do_ipv6only = true;
                        break;
 #endif
@@ -1284,7 +1248,7 @@ static int tdgram_bsd_dgram_socket(const struct 
tsocket_address *local,
        }
 
        if (do_bind) {
-               ret = bind(fd, &lbsda->u.sa, sa_socklen);
+               ret = bind(fd, &lbsda->u.sa, lbsda->sa_socklen);
                if (ret == -1) {
                        int saved_errno = errno;
                        talloc_free(dgram);
@@ -1300,7 +1264,7 @@ static int tdgram_bsd_dgram_socket(const struct 
tsocket_address *local,
                        return -1;
                }
 
-               ret = connect(fd, &rbsda->u.sa, sa_socklen);
+               ret = connect(fd, &rbsda->u.sa, rbsda->sa_socklen);
                if (ret == -1) {
                        int saved_errno = errno;
                        talloc_free(dgram);
@@ -1993,7 +1957,6 @@ static struct tevent_req * 
tstream_bsd_connect_send(TALLOC_CTX *mem_ctx,
        bool do_ipv6only = false;
        bool is_inet = false;
        int sa_fam = lbsda->u.sa.sa_family;
-       socklen_t sa_socklen = sizeof(rbsda->u.ss);
 
        req = tevent_req_create(mem_ctx, &state,
                                struct tstream_bsd_connect_state);
@@ -2017,11 +1980,6 @@ static struct tevent_req * 
tstream_bsd_connect_send(TALLOC_CTX *mem_ctx,
                        do_reuseaddr = true;
                        do_bind = true;
                }
-               /*
-                * for unix sockets we can't use the size of sockaddr_storage
-                * we would get EINVAL
-                */
-               sa_socklen = sizeof(rbsda->u.un);
                break;
        case AF_INET:
                if (lbsda->u.in.sin_port != 0) {
@@ -2032,7 +1990,6 @@ static struct tevent_req * 
tstream_bsd_connect_send(TALLOC_CTX *mem_ctx,
                        do_bind = true;
                }
                is_inet = true;
-               sa_socklen = sizeof(rbsda->u.in);
                break;
 #ifdef HAVE_IPV6
        case AF_INET6:
@@ -2046,7 +2003,6 @@ static struct tevent_req * 
tstream_bsd_connect_send(TALLOC_CTX *mem_ctx,
                        do_bind = true;
                }
                is_inet = true;
-               sa_socklen = sizeof(rbsda->u.in6);
                do_ipv6only = true;
                break;
 #endif
@@ -2059,12 +2015,10 @@ static struct tevent_req * 
tstream_bsd_connect_send(TALLOC_CTX *mem_ctx,
                sa_fam = rbsda->u.sa.sa_family;
                switch (sa_fam) {
                case AF_INET:
-                       sa_socklen = sizeof(rbsda->u.in);
                        do_ipv6only = false;
                        break;
 #ifdef HAVE_IPV6
                case AF_INET6:
-                       sa_socklen = sizeof(rbsda->u.in6);
                        do_ipv6only = true;
                        break;
 #endif
@@ -2108,7 +2062,7 @@ static struct tevent_req * 
tstream_bsd_connect_send(TALLOC_CTX *mem_ctx,
        }
 
        if (do_bind) {
-               ret = bind(state->fd, &lbsda->u.sa, sa_socklen);
+               ret = bind(state->fd, &lbsda->u.sa, lbsda->sa_socklen);
                if (ret == -1) {
                        tevent_req_error(req, errno);
                        goto post;
@@ -2120,7 +2074,7 @@ static struct tevent_req * 
tstream_bsd_connect_send(TALLOC_CTX *mem_ctx,
                goto post;
        }
 
-       ret = connect(state->fd, &rbsda->u.sa, sa_socklen);
+       ret = connect(state->fd, &rbsda->u.sa, rbsda->sa_socklen);
        err = tsocket_bsd_error_from_errno(ret, errno, &retry);
        if (retry) {
                /* retry later */


-- 
Samba Shared Repository

Reply via email to