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 | |
parent | e81a6ff6232a93a903c1f71a111ee469376b1e05 (diff) | |
download | luasocket-f399ab25fcecad2ff96a5977e8eaf069bb45473c.tar.gz luasocket-f399ab25fcecad2ff96a5977e8eaf069bb45473c.tar.bz2 luasocket-f399ab25fcecad2ff96a5977e8eaf069bb45473c.zip |
inet: Honor the strict aliasing rule
-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 | } |