Fix Rock sizeof sockaddr bug (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 20 Oct 2015 19:25:55 +0000 (15:25 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 28 Oct 2015 16:05:13 +0000 (12:05 -0400)
Whenever we consider the size of a Rock's sockaddr, we need to use the
sizeof a struct sockaddr_storage.

Rebuild glibc.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/bind.c
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/connect.c
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/plan9_sockets.c
tools/compilers/gcc-glibc/glibc-2.19-akaros/sysdeps/akaros/plan9_sockets.h

index d7a5707..5d04d8a 100644 (file)
@@ -40,7 +40,7 @@ int __bind(int fd, __CONST_SOCKADDR_ARG addr, socklen_t alen)
                errno = ENOTSOCK;
                return -1;
        }
-       if (alen > sizeof(r->addr)) {
+       if (alen > sizeof(r->addr_stor)) {
                errno = ENAMETOOLONG;
                return -1;
        }
index 1fda676..b2ae676 100644 (file)
@@ -42,7 +42,7 @@ int __connect(int fd, __CONST_SOCKADDR_ARG addr, socklen_t alen)
                errno = ENOTSOCK;
                return -1;
        }
-       if (alen > sizeof(r->raddr)) {
+       if (alen > sizeof(r->raddr_stor)) {
                errno = ENAMETOOLONG;
                return -1;
        }
index d26df10..c40149a 100644 (file)
@@ -177,9 +177,9 @@ Rock *_sock_newrock(int fd)
        r->stype = 0;
        r->sopts = 0;
        r->protocol = 0;
-       memset(&r->addr, 0, sizeof(r->addr));
+       memset(&r->addr, 0, sizeof(r->addr_stor));
        r->reserved = 0;
-       memset(&r->raddr, 0, sizeof(r->raddr));
+       memset(&r->raddr, 0, sizeof(r->raddr_stor));
        r->ctl[0] = '\0';
        r->other = -1;
        r->is_listener = FALSE;
@@ -225,8 +225,8 @@ _sock_data(int cfd, char *net, int domain, int type, int protocol, Rock ** rp)
        }
        if (rp)
                *rp = r;
-       memset(&r->raddr, 0, sizeof(r->raddr));
-       memset(&r->addr, 0, sizeof(r->addr));
+       memset(&r->raddr, 0, sizeof(r->raddr_stor));
+       memset(&r->addr, 0, sizeof(r->addr_stor));
        r->domain = domain;
        r->stype = _sock_strip_opts(type);
        r->sopts = _sock_get_opts(type);
index 46f6cea..a45f22b 100644 (file)
@@ -46,9 +46,15 @@ struct Rock {
        int stype;                                      /* socket type, from socket()'s type field */
        int sopts;                                      /* socket options, from socket()'s type field */
        int protocol;                           /* ... */
-       struct sockaddr addr;           /* address from bind */
        int reserved;                           /* use a priveledged port # (< 1024) */
-       struct sockaddr raddr;          /* peer address */
+       union {
+               struct sockaddr addr;   /* address from bind */
+               struct sockaddr_storage addr_stor;
+       };
+       union {
+               struct sockaddr raddr;  /* peer address */
+               struct sockaddr_storage raddr_stor;
+       };
        char ctl[Ctlsize];                      /* name of control file (if any) */
        int other;                                      /* fd of the remote end for Unix domain */
        bool is_listener;                       /* has called listen() and will accept() */