diff options
| author | Florian Zeitz <florob@babelmonkeys.de> | 2011-12-17 19:05:45 +0100 |
|---|---|---|
| committer | Sam Roberts <vieuxtech@gmail.com> | 2012-04-11 13:33:35 -0700 |
| commit | f399ab25fcecad2ff96a5977e8eaf069bb45473c (patch) | |
| tree | 4663828d8b68bf7d8e6e52e5a5b1c639a6fecdd4 /src | |
| parent | e81a6ff6232a93a903c1f71a111ee469376b1e05 (diff) | |
| download | luasocket-f399ab25fcecad2ff96a5977e8eaf069bb45473c.tar.gz luasocket-f399ab25fcecad2ff96a5977e8eaf069bb45473c.tar.bz2 luasocket-f399ab25fcecad2ff96a5977e8eaf069bb45473c.zip | |
inet: Honor the strict aliasing rule
Diffstat (limited to 'src')
| -rw-r--r-- | src/inet.c | 26 |
1 files changed, 14 insertions, 12 deletions
| @@ -169,11 +169,15 @@ static int inet_global_gethostname(lua_State *L) | |||
| 169 | \*-------------------------------------------------------------------------*/ | 169 | \*-------------------------------------------------------------------------*/ |
| 170 | int inet_meth_getpeername(lua_State *L, p_socket ps) | 170 | int inet_meth_getpeername(lua_State *L, p_socket ps) |
| 171 | { | 171 | { |
| 172 | struct sockaddr_storage peer; | 172 | union { |
| 173 | struct sockaddr *p = (struct sockaddr *)&peer; | 173 | struct sockaddr_storage sas; |
| 174 | socklen_t peer_len = sizeof(struct sockaddr_storage); | 174 | struct sockaddr sa; |
| 175 | struct sockaddr_in sa4; | ||
| 176 | struct sockaddr_in6 sa6; | ||
| 177 | } peer; | ||
| 178 | socklen_t peer_len = sizeof(peer); | ||
| 175 | 179 | ||
| 176 | if (getpeername(*ps, p, &peer_len) < 0) { | 180 | if (getpeername(*ps, &peer.sa, &peer_len) < 0) { |
| 177 | lua_pushnil(L); | 181 | lua_pushnil(L); |
| 178 | lua_pushfstring(L, "getpeername failed (%d): %s", errno, | 182 | lua_pushfstring(L, "getpeername failed (%d): %s", errno, |
| 179 | strerror(errno)); | 183 | strerror(errno)); |
| @@ -181,20 +185,18 @@ int inet_meth_getpeername(lua_State *L, p_socket ps) | |||
| 181 | char ipaddr[INET6_ADDRSTRLEN] = ""; | 185 | char ipaddr[INET6_ADDRSTRLEN] = ""; |
| 182 | unsigned short port = 0; | 186 | unsigned short port = 0; |
| 183 | 187 | ||
| 184 | switch (p->sa_family) { | 188 | switch (peer.sa.sa_family) { |
| 185 | case AF_INET: | 189 | case AF_INET: |
| 186 | inet_ntop(AF_INET, &((struct sockaddr_in *)&peer)->sin_addr, | 190 | inet_ntop(AF_INET, &peer.sa4.sin_addr, ipaddr, sizeof(ipaddr)); |
| 187 | ipaddr, sizeof(ipaddr)); | 191 | port = ntohs(peer.sa4.sin_port); |
| 188 | port = ntohs(((struct sockaddr_in *)&peer)->sin_port); | ||
| 189 | break; | 192 | break; |
| 190 | case AF_INET6: | 193 | case AF_INET6: |
| 191 | inet_ntop(AF_INET6, &((struct sockaddr_in6 *)&peer)->sin6_addr, | 194 | inet_ntop(AF_INET6, &peer.sa6.sin6_addr, ipaddr, sizeof(ipaddr)); |
| 192 | ipaddr, sizeof(ipaddr)); | 195 | port = ntohs(peer.sa6.sin6_port); |
| 193 | port = ntohs(((struct sockaddr_in6 *)&peer)->sin6_port); | ||
| 194 | break; | 196 | break; |
| 195 | default: | 197 | default: |
| 196 | lua_pushnil(L); | 198 | lua_pushnil(L); |
| 197 | lua_pushfstring(L, "Unknown address family %d", p->sa_family); | 199 | lua_pushfstring(L, "Unknown address family %d", peer.sa.sa_family); |
| 198 | return 2; | 200 | return 2; |
| 199 | break; | 201 | break; |
| 200 | } | 202 | } |
