comparison src/http/ngx_http.c @ 3395:4e15548b29d4

fix building by gcc 4.4 with -O2/3/s: dereferencing pointer 'sin' does break strict-aliasing rules
author Igor Sysoev <igor@sysoev.ru>
date Tue, 22 Dec 2009 15:15:45 +0000
parents 6b8e5c882e47
children 187783310b65
comparison
equal deleted inserted replaced
3394:11965c62b92c 3395:4e15548b29d4
1115 if (cmcf->ports == NULL) { 1115 if (cmcf->ports == NULL) {
1116 return NGX_ERROR; 1116 return NGX_ERROR;
1117 } 1117 }
1118 } 1118 }
1119 1119
1120 sa = (struct sockaddr *) &lsopt->sockaddr; 1120 sa = &lsopt->u.sockaddr;
1121 1121
1122 switch (sa->sa_family) { 1122 switch (sa->sa_family) {
1123 1123
1124 #if (NGX_HAVE_INET6) 1124 #if (NGX_HAVE_INET6)
1125 case AF_INET6: 1125 case AF_INET6:
1126 sin6 = (struct sockaddr_in6 *) sa; 1126 sin6 = &lsopt->u.sockaddr_in6;
1127 p = sin6->sin6_port; 1127 p = sin6->sin6_port;
1128 break; 1128 break;
1129 #endif 1129 #endif
1130 1130
1131 #if (NGX_HAVE_UNIX_DOMAIN) 1131 #if (NGX_HAVE_UNIX_DOMAIN)
1133 p = 0; 1133 p = 0;
1134 break; 1134 break;
1135 #endif 1135 #endif
1136 1136
1137 default: /* AF_INET */ 1137 default: /* AF_INET */
1138 sin = (struct sockaddr_in *) sa; 1138 sin = &lsopt->u.sockaddr_in;
1139 p = sin->sin_port; 1139 p = sin->sin_port;
1140 break; 1140 break;
1141 } 1141 }
1142 1142
1143 port = cmcf->ports->elts; 1143 port = cmcf->ports->elts;
1183 /* 1183 /*
1184 * we can not compare whole sockaddr struct's as kernel 1184 * we can not compare whole sockaddr struct's as kernel
1185 * may fill some fields in inherited sockaddr struct's 1185 * may fill some fields in inherited sockaddr struct's
1186 */ 1186 */
1187 1187
1188 sa = (struct sockaddr *) &lsopt->sockaddr; 1188 sa = &lsopt->u.sockaddr;
1189 1189
1190 switch (sa->sa_family) { 1190 switch (sa->sa_family) {
1191 1191
1192 #if (NGX_HAVE_INET6) 1192 #if (NGX_HAVE_INET6)
1193 case AF_INET6: 1193 case AF_INET6:
1207 off = offsetof(struct sockaddr_in, sin_addr); 1207 off = offsetof(struct sockaddr_in, sin_addr);
1208 len = 4; 1208 len = 4;
1209 break; 1209 break;
1210 } 1210 }
1211 1211
1212 p = lsopt->sockaddr + off; 1212 p = lsopt->u.sockaddr_data + off;
1213 1213
1214 addr = port->addrs.elts; 1214 addr = port->addrs.elts;
1215 1215
1216 for (i = 0; i < port->addrs.nelts; i++) { 1216 for (i = 0; i < port->addrs.nelts; i++) {
1217 1217
1218 if (ngx_memcmp(p, (u_char *) addr[i].opt.sockaddr + off, len) != 0) { 1218 if (ngx_memcmp(p, addr[i].opt.u.sockaddr_data + off, len) != 0) {
1219 continue; 1219 continue;
1220 } 1220 }
1221 1221
1222 /* the address is already in the address list */ 1222 /* the address is already in the address list */
1223 1223
1672 { 1672 {
1673 ngx_listening_t *ls; 1673 ngx_listening_t *ls;
1674 ngx_http_core_loc_conf_t *clcf; 1674 ngx_http_core_loc_conf_t *clcf;
1675 ngx_http_core_srv_conf_t *cscf; 1675 ngx_http_core_srv_conf_t *cscf;
1676 1676
1677 ls = ngx_create_listening(cf, addr->opt.sockaddr, addr->opt.socklen); 1677 ls = ngx_create_listening(cf, &addr->opt.u.sockaddr, addr->opt.socklen);
1678 if (ls == NULL) { 1678 if (ls == NULL) {
1679 return NULL; 1679 return NULL;
1680 } 1680 }
1681 1681
1682 ls->addr_ntop = 1; 1682 ls->addr_ntop = 1;
1741 1741
1742 addrs = hport->addrs; 1742 addrs = hport->addrs;
1743 1743
1744 for (i = 0; i < hport->naddrs; i++) { 1744 for (i = 0; i < hport->naddrs; i++) {
1745 1745
1746 sin = (struct sockaddr_in *) addr[i].opt.sockaddr; 1746 sin = &addr[i].opt.u.sockaddr_in;
1747 addrs[i].addr = sin->sin_addr.s_addr; 1747 addrs[i].addr = sin->sin_addr.s_addr;
1748 addrs[i].conf.default_server = addr[i].default_server; 1748 addrs[i].conf.default_server = addr[i].default_server;
1749 #if (NGX_HTTP_SSL) 1749 #if (NGX_HTTP_SSL)
1750 addrs[i].conf.ssl = addr[i].opt.ssl; 1750 addrs[i].conf.ssl = addr[i].opt.ssl;
1751 #endif 1751 #endif
1802 1802
1803 addrs6 = hport->addrs; 1803 addrs6 = hport->addrs;
1804 1804
1805 for (i = 0; i < hport->naddrs; i++) { 1805 for (i = 0; i < hport->naddrs; i++) {
1806 1806
1807 sin6 = (struct sockaddr_in6 *) addr[i].opt.sockaddr; 1807 sin6 = &addr[i].opt.u.sockaddr_in6;
1808 addrs6[i].addr6 = sin6->sin6_addr; 1808 addrs6[i].addr6 = sin6->sin6_addr;
1809 addrs6[i].conf.default_server = addr[i].default_server; 1809 addrs6[i].conf.default_server = addr[i].default_server;
1810 #if (NGX_HTTP_SSL) 1810 #if (NGX_HTTP_SSL)
1811 addrs6[i].conf.ssl = addr[i].opt.ssl; 1811 addrs6[i].conf.ssl = addr[i].opt.ssl;
1812 #endif 1812 #endif