mirror of
https://github.com/nginx/nginx.git
synced 2025-07-31 02:26:15 +08:00
fix building by gcc 4.4 with -O2/3/s:
dereferencing pointer 'sin' does break strict-aliasing rules
This commit is contained in:
parent
9cf418ea92
commit
8c97fa9ae4
@ -1117,13 +1117,13 @@ ngx_http_add_listen(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,
|
||||
}
|
||||
}
|
||||
|
||||
sa = (struct sockaddr *) &lsopt->sockaddr;
|
||||
sa = &lsopt->u.sockaddr;
|
||||
|
||||
switch (sa->sa_family) {
|
||||
|
||||
#if (NGX_HAVE_INET6)
|
||||
case AF_INET6:
|
||||
sin6 = (struct sockaddr_in6 *) sa;
|
||||
sin6 = &lsopt->u.sockaddr_in6;
|
||||
p = sin6->sin6_port;
|
||||
break;
|
||||
#endif
|
||||
@ -1135,7 +1135,7 @@ ngx_http_add_listen(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,
|
||||
#endif
|
||||
|
||||
default: /* AF_INET */
|
||||
sin = (struct sockaddr_in *) sa;
|
||||
sin = &lsopt->u.sockaddr_in;
|
||||
p = sin->sin_port;
|
||||
break;
|
||||
}
|
||||
@ -1185,7 +1185,7 @@ ngx_http_add_addresses(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,
|
||||
* may fill some fields in inherited sockaddr struct's
|
||||
*/
|
||||
|
||||
sa = (struct sockaddr *) &lsopt->sockaddr;
|
||||
sa = &lsopt->u.sockaddr;
|
||||
|
||||
switch (sa->sa_family) {
|
||||
|
||||
@ -1209,13 +1209,13 @@ ngx_http_add_addresses(ngx_conf_t *cf, ngx_http_core_srv_conf_t *cscf,
|
||||
break;
|
||||
}
|
||||
|
||||
p = lsopt->sockaddr + off;
|
||||
p = lsopt->u.sockaddr_data + off;
|
||||
|
||||
addr = port->addrs.elts;
|
||||
|
||||
for (i = 0; i < port->addrs.nelts; i++) {
|
||||
|
||||
if (ngx_memcmp(p, (u_char *) addr[i].opt.sockaddr + off, len) != 0) {
|
||||
if (ngx_memcmp(p, addr[i].opt.u.sockaddr_data + off, len) != 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -1674,7 +1674,7 @@ ngx_http_add_listening(ngx_conf_t *cf, ngx_http_conf_addr_t *addr)
|
||||
ngx_http_core_loc_conf_t *clcf;
|
||||
ngx_http_core_srv_conf_t *cscf;
|
||||
|
||||
ls = ngx_create_listening(cf, addr->opt.sockaddr, addr->opt.socklen);
|
||||
ls = ngx_create_listening(cf, &addr->opt.u.sockaddr, addr->opt.socklen);
|
||||
if (ls == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
@ -1743,7 +1743,7 @@ ngx_http_add_addrs(ngx_conf_t *cf, ngx_http_port_t *hport,
|
||||
|
||||
for (i = 0; i < hport->naddrs; i++) {
|
||||
|
||||
sin = (struct sockaddr_in *) addr[i].opt.sockaddr;
|
||||
sin = &addr[i].opt.u.sockaddr_in;
|
||||
addrs[i].addr = sin->sin_addr.s_addr;
|
||||
addrs[i].conf.default_server = addr[i].default_server;
|
||||
#if (NGX_HTTP_SSL)
|
||||
@ -1804,7 +1804,7 @@ ngx_http_add_addrs6(ngx_conf_t *cf, ngx_http_port_t *hport,
|
||||
|
||||
for (i = 0; i < hport->naddrs; i++) {
|
||||
|
||||
sin6 = (struct sockaddr_in6 *) addr[i].opt.sockaddr;
|
||||
sin6 = &addr[i].opt.u.sockaddr_in6;
|
||||
addrs6[i].addr6 = sin6->sin6_addr;
|
||||
addrs6[i].conf.default_server = addr[i].default_server;
|
||||
#if (NGX_HTTP_SSL)
|
||||
|
@ -2850,7 +2850,7 @@ ngx_http_core_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)
|
||||
if (!conf->listen) {
|
||||
ngx_memzero(&lsopt, sizeof(ngx_http_listen_opt_t));
|
||||
|
||||
sin = (struct sockaddr_in *) &lsopt.sockaddr;
|
||||
sin = &lsopt.u.sockaddr_in;
|
||||
|
||||
sin->sin_family = AF_INET;
|
||||
#if (NGX_WIN32)
|
||||
@ -2867,7 +2867,7 @@ ngx_http_core_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)
|
||||
lsopt.sndbuf = -1;
|
||||
lsopt.wildcard = 1;
|
||||
|
||||
(void) ngx_sock_ntop((struct sockaddr *) &lsopt.sockaddr, lsopt.addr,
|
||||
(void) ngx_sock_ntop(&lsopt.u.sockaddr, lsopt.addr,
|
||||
NGX_SOCKADDR_STRLEN, 1);
|
||||
|
||||
if (ngx_http_add_listen(cf, conf, &lsopt) == NGX_OK) {
|
||||
@ -3275,7 +3275,7 @@ ngx_http_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
||||
|
||||
ngx_memzero(&lsopt, sizeof(ngx_http_listen_opt_t));
|
||||
|
||||
ngx_memcpy(lsopt.sockaddr, u.sockaddr, u.socklen);
|
||||
ngx_memcpy(&lsopt.u.sockaddr, u.sockaddr, u.socklen);
|
||||
|
||||
lsopt.socklen = u.socklen;
|
||||
lsopt.backlog = NGX_LISTEN_BACKLOG;
|
||||
@ -3283,7 +3283,7 @@ ngx_http_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
||||
lsopt.sndbuf = -1;
|
||||
lsopt.wildcard = u.wildcard;
|
||||
|
||||
(void) ngx_sock_ntop((struct sockaddr *) &lsopt.sockaddr, lsopt.addr,
|
||||
(void) ngx_sock_ntop(&lsopt.u.sockaddr, lsopt.addr,
|
||||
NGX_SOCKADDR_STRLEN, 1);
|
||||
|
||||
for (n = 2; n < cf->args->nelts; n++) {
|
||||
@ -3380,7 +3380,7 @@ ngx_http_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
|
||||
#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)
|
||||
struct sockaddr *sa;
|
||||
|
||||
sa = (struct sockaddr *) lsopt.sockaddr;
|
||||
sa = &lsopt.u.sockaddr;
|
||||
|
||||
if (sa->sa_family == AF_INET6) {
|
||||
|
||||
|
@ -43,7 +43,18 @@ typedef struct ngx_http_core_loc_conf_s ngx_http_core_loc_conf_t;
|
||||
|
||||
|
||||
typedef struct {
|
||||
u_char sockaddr[NGX_SOCKADDRLEN];
|
||||
union {
|
||||
struct sockaddr sockaddr;
|
||||
struct sockaddr_in sockaddr_in;
|
||||
#if (NGX_HAVE_INET6)
|
||||
struct sockaddr_in6 sockaddr_in6;
|
||||
#endif
|
||||
#if (NGX_HAVE_UNIX_DOMAIN)
|
||||
struct sockaddr_un sockaddr_un;
|
||||
#endif
|
||||
u_char sockaddr_data[NGX_SOCKADDRLEN];
|
||||
} u;
|
||||
|
||||
socklen_t socklen;
|
||||
|
||||
unsigned set:1;
|
||||
|
Loading…
Reference in New Issue
Block a user