]> err.no Git - varnish/commitdiff
Further sockaddr/sockaddr_storage sanitation in order to quiet FlexeLint
authorphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Sun, 24 Jun 2007 10:43:15 +0000 (10:43 +0000)
committerphk <phk@d4fa192b-c00b-0410-8231-f00ffab90ce4>
Sun, 24 Jun 2007 10:43:15 +0000 (10:43 +0000)
git-svn-id: svn+ssh://projects.linpro.no/svn/varnish/trunk@1547 d4fa192b-c00b-0410-8231-f00ffab90ce4

varnish-cache/bin/varnishd/cache.h
varnish-cache/bin/varnishd/cache_acceptor.c
varnish-cache/bin/varnishd/cache_session.c
varnish-cache/bin/varnishd/cache_vrt.c
varnish-cache/bin/varnishd/cache_vrt_acl.c
varnish-cache/bin/varnishd/mgt_cli.c
varnish-cache/bin/varnishd/tcp.c

index fdf248c08e536a721f114cd54d97b5829d7a8366..00ce1d1206c750f92c8157f86c9fbec75cd645b2 100644 (file)
@@ -276,10 +276,10 @@ struct sess {
 
        struct worker           *wrk;
 
-       unsigned                sockaddrlen;
-       struct sockaddr_storage sockaddr[1];
-       unsigned                mysockaddrlen;
-       struct sockaddr_storage mysockaddr[1];
+       socklen_t               sockaddrlen;
+       socklen_t               mysockaddrlen;
+       struct sockaddr         *sockaddr;
+       struct sockaddr         *mysockaddr;
 
        /* formatted ascii client address */
        char                    addr[TCP_ADDRBUFSIZE];
index e59418a05ec29fd4c96db02d2315e4a946d9cfc3..b505eb8f17d1654e9534440d2ccc7ceccfae05de 100644 (file)
@@ -113,7 +113,7 @@ void
 VCA_Prep(struct sess *sp)
 {
 
-       TCP_name((struct sockaddr *)sp->sockaddr, sp->sockaddrlen,
+       TCP_name(sp->sockaddr, sp->sockaddrlen,
            sp->addr, sizeof sp->addr, sp->port, sizeof sp->port);
        VSL(SLT_SessionOpen, sp->fd, "%s %s", sp->addr, sp->port);
        sp->acct.first = sp->t_open.tv_sec;
index 2ca9efbf5d5acc07edfa2cdf1136fb48fcc49e47..390f270fd69dc213c6d8762ae0db5ea18b1151e9 100644 (file)
@@ -67,6 +67,7 @@ struct sessmem {
        struct http             http;
        unsigned                workspace;
        TAILQ_ENTRY(sessmem)    list;
+       struct sockaddr_storage sockaddr[2];
 };
 
 static TAILQ_HEAD(,sessmem)    ses_free_mem[2] = {
@@ -255,6 +256,7 @@ struct sess *
 SES_New(struct sockaddr *addr, unsigned len)
 {
        struct sessmem *sm;
+       struct sess *sp;
        volatile unsigned u;
 
        /*
@@ -295,20 +297,26 @@ SES_New(struct sockaddr *addr, unsigned len)
                return (NULL);
        CHECK_OBJ_NOTNULL(sm, SESSMEM_MAGIC);
        VSL_stats->n_sess++;
-       memset(&sm->sess, 0, sizeof sm->sess);
-       sm->sess.magic = SESS_MAGIC;
-       sm->sess.mem = sm;
-       sm->sess.http = &sm->http;
-
-       assert(len < sizeof(sm->sess.sockaddr));
+       sp = &sm->sess;
+       memset(sp, 0, sizeof *sp);
+       sp->magic = SESS_MAGIC;
+       sp->mem = sm;
+       sp->http = &sm->http;
+       sp->sockaddr = (void*)(&sm->sockaddr[0]);
+       sp->sockaddrlen = sizeof(sm->sockaddr[0]);
+       sp->mysockaddr = (void*)(&sm->sockaddr[1]);
+       sp->mysockaddrlen = sizeof(sm->sockaddr[1]);
+       sp->sockaddr->sa_family = sp->mysockaddr->sa_family = PF_UNSPEC;
+
+       assert(len <= sp->sockaddrlen);
        if (addr != NULL) {
-               memcpy(sm->sess.sockaddr, addr, len);
-               sm->sess.sockaddrlen = len;
+               memcpy(sp->sockaddr, addr, len);
+               sp->sockaddrlen = len;
        }
 
        http_Setup(&sm->http, (void *)(sm + 1), sm->workspace);
 
-       return (&sm->sess);
+       return (sp);
 }
 
 void
index 34d6b3076e7c3cdd723b8380e841abf2bd5ff5ff..13256f64ad3bdf2b9bf999d91b82be455999d484 100644 (file)
@@ -257,22 +257,17 @@ struct sockaddr *
 VRT_r_client_ip(struct sess *sp)
 {
 
-       return ((struct sockaddr *)sp->sockaddr);
+       return (sp->sockaddr);
 }
 
 struct sockaddr *
 VRT_r_server_ip(struct sess *sp)
 {
-       socklen_t l;
 
-       if (sp->mysockaddrlen == 0) {
-               l = sizeof sp->mysockaddr;
-               AZ(getsockname(sp->fd,
-                   (struct sockaddr*)sp->mysockaddr, &l));
-               sp->mysockaddrlen = l;
-       }
+       if (sp->mysockaddr->sa_family == AF_UNSPEC)
+               AZ(getsockname(sp->fd, sp->mysockaddr, &sp->mysockaddrlen));
 
-       return ((struct sockaddr*)sp->mysockaddr);
+       return (sp->mysockaddr);
 }
 
 /*--------------------------------------------------------------------*/
index 6dc1a5d0f3456716d312da3ec41c84bf2b3e3d28..1157d02a2bc57ebe78b47bcde483351724f6c84e 100644 (file)
@@ -104,7 +104,7 @@ VRT_acl_match(struct sess *sp, struct sockaddr *sa, const char *acln, struct vrt
                for (a1 = ap->priv; a1 != NULL; a1 = a1->ai_next) {
 
                        /* only match the right family */
-                       if (a1->ai_family != sp->sockaddr->ss_family)
+                       if (a1->ai_family != sp->sockaddr->sa_family)
                                continue;
 
                        if (a1->ai_family == AF_INET) {
index e7991593fc08b09b8628b8a81007f90d0dfc77d9..f7964a94504748c47725ae38f66f7972c1a4cece 100644 (file)
@@ -380,7 +380,7 @@ telnet_accept(struct ev *ev, int what)
 
        (void)what;
        addrlen = sizeof addr;
-       i = accept(ev->fd, (struct sockaddr *)&addr, &addrlen);
+       i = accept(ev->fd, (void *)&addr, &addrlen);
        if (i < 0)
                return (0);
 
index cc6e05a937e668128bf0f9a30864427c150cf9b9..b3d6c2656b5ca4d2bb446fee0cd9ba33a5833354 100644 (file)
@@ -76,7 +76,8 @@ TCP_name(struct sockaddr *addr, unsigned l, char *abuf, unsigned alen, char *pbu
 void
 TCP_myname(int sock, char *abuf, unsigned alen, char *pbuf, unsigned plen)
 {
-       struct sockaddr addr[2];        /* XXX: IPv6 hack */
+       struct sockaddr_storage addr_s;
+       struct sockaddr *addr = (void*)&addr_s;
        socklen_t l;
 
        l = sizeof addr;