aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Zeitz <florob@babelmonkeys.de>2011-12-17 19:05:45 +0100
committerSam Roberts <vieuxtech@gmail.com>2012-04-11 13:33:35 -0700
commitf399ab25fcecad2ff96a5977e8eaf069bb45473c (patch)
tree4663828d8b68bf7d8e6e52e5a5b1c639a6fecdd4
parente81a6ff6232a93a903c1f71a111ee469376b1e05 (diff)
downloadluasocket-f399ab25fcecad2ff96a5977e8eaf069bb45473c.tar.gz
luasocket-f399ab25fcecad2ff96a5977e8eaf069bb45473c.tar.bz2
luasocket-f399ab25fcecad2ff96a5977e8eaf069bb45473c.zip
inet: Honor the strict aliasing rule
-rw-r--r--src/inet.c26
1 files changed, 14 insertions, 12 deletions
diff --git a/src/inet.c b/src/inet.c
index dc24390..839fe5f 100644
--- a/src/inet.c
+++ b/src/inet.c
@@ -169,11 +169,15 @@ static int inet_global_gethostname(lua_State *L)
169\*-------------------------------------------------------------------------*/ 169\*-------------------------------------------------------------------------*/
170int inet_meth_getpeername(lua_State *L, p_socket ps) 170int 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 }