Commit c97b311c authored by Poul-Henning Kamp's avatar Poul-Henning Kamp

Further sockaddr/sockaddr_storage sanitation in order to quiet FlexeLint


git-svn-id: http://www.varnish-cache.org/svn/trunk/varnish-cache@1547 d4fa192b-c00b-0410-8231-f00ffab90ce4
parent f6243606
...@@ -276,10 +276,10 @@ struct sess { ...@@ -276,10 +276,10 @@ struct sess {
struct worker *wrk; struct worker *wrk;
unsigned sockaddrlen; socklen_t sockaddrlen;
struct sockaddr_storage sockaddr[1]; socklen_t mysockaddrlen;
unsigned mysockaddrlen; struct sockaddr *sockaddr;
struct sockaddr_storage mysockaddr[1]; struct sockaddr *mysockaddr;
/* formatted ascii client address */ /* formatted ascii client address */
char addr[TCP_ADDRBUFSIZE]; char addr[TCP_ADDRBUFSIZE];
......
...@@ -113,7 +113,7 @@ void ...@@ -113,7 +113,7 @@ void
VCA_Prep(struct sess *sp) 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); sp->addr, sizeof sp->addr, sp->port, sizeof sp->port);
VSL(SLT_SessionOpen, sp->fd, "%s %s", sp->addr, sp->port); VSL(SLT_SessionOpen, sp->fd, "%s %s", sp->addr, sp->port);
sp->acct.first = sp->t_open.tv_sec; sp->acct.first = sp->t_open.tv_sec;
......
...@@ -67,6 +67,7 @@ struct sessmem { ...@@ -67,6 +67,7 @@ struct sessmem {
struct http http; struct http http;
unsigned workspace; unsigned workspace;
TAILQ_ENTRY(sessmem) list; TAILQ_ENTRY(sessmem) list;
struct sockaddr_storage sockaddr[2];
}; };
static TAILQ_HEAD(,sessmem) ses_free_mem[2] = { static TAILQ_HEAD(,sessmem) ses_free_mem[2] = {
...@@ -255,6 +256,7 @@ struct sess * ...@@ -255,6 +256,7 @@ struct sess *
SES_New(struct sockaddr *addr, unsigned len) SES_New(struct sockaddr *addr, unsigned len)
{ {
struct sessmem *sm; struct sessmem *sm;
struct sess *sp;
volatile unsigned u; volatile unsigned u;
/* /*
...@@ -295,20 +297,26 @@ SES_New(struct sockaddr *addr, unsigned len) ...@@ -295,20 +297,26 @@ SES_New(struct sockaddr *addr, unsigned len)
return (NULL); return (NULL);
CHECK_OBJ_NOTNULL(sm, SESSMEM_MAGIC); CHECK_OBJ_NOTNULL(sm, SESSMEM_MAGIC);
VSL_stats->n_sess++; VSL_stats->n_sess++;
memset(&sm->sess, 0, sizeof sm->sess); sp = &sm->sess;
sm->sess.magic = SESS_MAGIC; memset(sp, 0, sizeof *sp);
sm->sess.mem = sm; sp->magic = SESS_MAGIC;
sm->sess.http = &sm->http; sp->mem = sm;
sp->http = &sm->http;
assert(len < sizeof(sm->sess.sockaddr)); 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) { if (addr != NULL) {
memcpy(sm->sess.sockaddr, addr, len); memcpy(sp->sockaddr, addr, len);
sm->sess.sockaddrlen = len; sp->sockaddrlen = len;
} }
http_Setup(&sm->http, (void *)(sm + 1), sm->workspace); http_Setup(&sm->http, (void *)(sm + 1), sm->workspace);
return (&sm->sess); return (sp);
} }
void void
......
...@@ -257,22 +257,17 @@ struct sockaddr * ...@@ -257,22 +257,17 @@ struct sockaddr *
VRT_r_client_ip(struct sess *sp) VRT_r_client_ip(struct sess *sp)
{ {
return ((struct sockaddr *)sp->sockaddr); return (sp->sockaddr);
} }
struct sockaddr * struct sockaddr *
VRT_r_server_ip(struct sess *sp) VRT_r_server_ip(struct sess *sp)
{ {
socklen_t l;
if (sp->mysockaddrlen == 0) { if (sp->mysockaddr->sa_family == AF_UNSPEC)
l = sizeof sp->mysockaddr; AZ(getsockname(sp->fd, sp->mysockaddr, &sp->mysockaddrlen));
AZ(getsockname(sp->fd,
(struct sockaddr*)sp->mysockaddr, &l));
sp->mysockaddrlen = l;
}
return ((struct sockaddr*)sp->mysockaddr); return (sp->mysockaddr);
} }
/*--------------------------------------------------------------------*/ /*--------------------------------------------------------------------*/
......
...@@ -104,7 +104,7 @@ VRT_acl_match(struct sess *sp, struct sockaddr *sa, const char *acln, struct vrt ...@@ -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) { for (a1 = ap->priv; a1 != NULL; a1 = a1->ai_next) {
/* only match the right family */ /* only match the right family */
if (a1->ai_family != sp->sockaddr->ss_family) if (a1->ai_family != sp->sockaddr->sa_family)
continue; continue;
if (a1->ai_family == AF_INET) { if (a1->ai_family == AF_INET) {
......
...@@ -380,7 +380,7 @@ telnet_accept(struct ev *ev, int what) ...@@ -380,7 +380,7 @@ telnet_accept(struct ev *ev, int what)
(void)what; (void)what;
addrlen = sizeof addr; addrlen = sizeof addr;
i = accept(ev->fd, (struct sockaddr *)&addr, &addrlen); i = accept(ev->fd, (void *)&addr, &addrlen);
if (i < 0) if (i < 0)
return (0); return (0);
......
...@@ -76,7 +76,8 @@ TCP_name(struct sockaddr *addr, unsigned l, char *abuf, unsigned alen, char *pbu ...@@ -76,7 +76,8 @@ TCP_name(struct sockaddr *addr, unsigned l, char *abuf, unsigned alen, char *pbu
void void
TCP_myname(int sock, char *abuf, unsigned alen, char *pbuf, unsigned plen) 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; socklen_t l;
l = sizeof addr; l = sizeof addr;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment