diff options
| author | Nalin Dahyabhai <nalin.dahyabhai@pobox.com> | 2009-02-11 18:33:03 -0500 |
|---|---|---|
| committer | Nalin Dahyabhai <nalin.dahyabhai@pobox.com> | 2009-02-11 18:33:03 -0500 |
| commit | 6c96b11141bc8dd7d5df4812ea2bf395756503de (patch) | |
| tree | 1bd510da79329772c343c71ba07368fc531c5dc7 /src | |
| parent | 4118a0c053531ed45299318a5fcececcab94a314 (diff) | |
- fix strict-aliasing errors
Diffstat (limited to 'src')
| -rw-r--r-- | src/disp-nis.c | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/src/disp-nis.c b/src/disp-nis.c index a69c18a..4c92f8c 100644 --- a/src/disp-nis.c +++ b/src/disp-nis.c @@ -59,11 +59,18 @@ struct request_info; #endif +union dispatch_client_addr { + struct sockaddr_storage ss; + struct sockaddr s; + struct sockaddr_in sin; + struct sockaddr_in6 sin6; +}; + /* Handle all incoming data. */ struct dispatch_client { /* The client socket and address. */ int client_fd; - struct sockaddr_storage client_addr; + union dispatch_client_addr client_addr; socklen_t client_addrlen; bool_t client_secure; /* The client state. */ @@ -98,7 +105,7 @@ struct dispatch_client_data { /* Data for disconnected clients. */ struct { int client_fd; - struct sockaddr_storage client_addr; + union dispatch_client_addr client_addr; socklen_t client_addrlen; bool_t client_secure; char *reply_buf; @@ -235,19 +242,19 @@ dispatch_securenets_add(struct plugin_state *state, const char *value) } static bool_t dispatch_securenets_check(struct plugin_state *state, - struct sockaddr_storage *client_addr) + union dispatch_client_addr *client_addr) { struct securenet_info *sn; struct in_addr addr; struct in6_addr addr6, mask6, masked6; int i; for (sn = state->securenet_info; sn != NULL; sn = sn->sn_next) { - switch (client_addr->ss_family) { + switch (client_addr->ss.ss_family) { case AF_INET: if (sn->sn_family != AF_INET) { continue; } - addr = ((struct sockaddr_in*) client_addr)->sin_addr; + addr = client_addr->sin.sin_addr; if ((addr.s_addr & sn->sn_addr.sin.netmask.s_addr) == (sn->sn_addr.sin.address.s_addr & @@ -256,7 +263,7 @@ dispatch_securenets_check(struct plugin_state *state, } break; case AF_INET6: - addr6 = ((struct sockaddr_in6*) client_addr)->sin6_addr; + addr6 = client_addr->sin6.sin6_addr; if ((sn->sn_family == AF_INET) && IN6_IS_ADDR_V4MAPPED(&addr6)) { if ((((uint32_t*)addr6.s6_addr)[3] & @@ -466,15 +473,15 @@ dispatch_dgram(struct plugin_state *state, int fd) "datagram request permitted by securenets\n"); } - switch (cdata.dgram.client_addr.ss_family) { + switch (cdata.dgram.client_addr.ss.ss_family) { struct sockaddr_in *sin; struct sockaddr_in6 *sin6; case AF_INET: - sin = (struct sockaddr_in *) &cdata.dgram.client_addr; + sin = (struct sockaddr_in *) &cdata.dgram.client_addr.sin; cdata.dgram.client_secure = ntohs(sin->sin_port) < 1024; break; case AF_INET6: - sin6 = (struct sockaddr_in6 *) &cdata.dgram.client_addr; + sin6 = (struct sockaddr_in6 *) &cdata.dgram.client_addr.sin6; cdata.dgram.client_secure = ntohs(sin6->sin6_port) < 1024; break; default: @@ -559,7 +566,7 @@ dispatch_accept_client(struct plugin_state *state, int fd) linger.l_onoff = 1; linger.l_linger = 0; setsockopt(fd, SOL_SOCKET, SO_LINGER, &linger, sizeof(linger)); - switch (client->client_addr.ss_family) { + switch (client->client_addr.ss.ss_family) { struct sockaddr_in *sin; struct sockaddr_in6 *sin6; case AF_INET: |
