Use type-punning to avoid breaking strict aliasing rules

While the actual use here would be unlikely to be broken by any C
optimization, it is better to use explicit union construction to let
gcc know about the aliasing and avoid warnings from gcc 4.4.
This commit is contained in:
Jouni Malinen 2009-11-05 12:11:49 +02:00 committed by Jouni Malinen
parent d27df100b5
commit 5a641ae01e

View file

@ -667,7 +667,13 @@ static void radius_server_receive_auth(int sock, void *eloop_ctx,
{ {
struct radius_server_data *data = eloop_ctx; struct radius_server_data *data = eloop_ctx;
u8 *buf = NULL; u8 *buf = NULL;
struct sockaddr_storage from; union {
struct sockaddr_storage ss;
struct sockaddr_in sin;
#ifdef CONFIG_IPV6
struct sockaddr_in6 sin6;
#endif /* CONFIG_IPV6 */
} from;
socklen_t fromlen; socklen_t fromlen;
int len; int len;
struct radius_client *client = NULL; struct radius_client *client = NULL;
@ -682,7 +688,7 @@ static void radius_server_receive_auth(int sock, void *eloop_ctx,
fromlen = sizeof(from); fromlen = sizeof(from);
len = recvfrom(sock, buf, RADIUS_MAX_MSG_LEN, 0, len = recvfrom(sock, buf, RADIUS_MAX_MSG_LEN, 0,
(struct sockaddr *) &from, &fromlen); (struct sockaddr *) &from.ss, &fromlen);
if (len < 0) { if (len < 0) {
perror("recvfrom[radius_server]"); perror("recvfrom[radius_server]");
goto fail; goto fail;
@ -690,28 +696,26 @@ static void radius_server_receive_auth(int sock, void *eloop_ctx,
#ifdef CONFIG_IPV6 #ifdef CONFIG_IPV6
if (data->ipv6) { if (data->ipv6) {
struct sockaddr_in6 *from6 = (struct sockaddr_in6 *) &from; if (inet_ntop(AF_INET6, &from.sin6.sin6_addr, abuf,
if (inet_ntop(AF_INET6, &from6->sin6_addr, abuf, sizeof(abuf)) sizeof(abuf)) == NULL)
== NULL)
abuf[0] = '\0'; abuf[0] = '\0';
from_port = ntohs(from6->sin6_port); from_port = ntohs(from.sin6.sin6_port);
RADIUS_DEBUG("Received %d bytes from %s:%d", RADIUS_DEBUG("Received %d bytes from %s:%d",
len, abuf, from_port); len, abuf, from_port);
client = radius_server_get_client(data, client = radius_server_get_client(data,
(struct in_addr *) (struct in_addr *)
&from6->sin6_addr, 1); &from.sin6.sin6_addr, 1);
} }
#endif /* CONFIG_IPV6 */ #endif /* CONFIG_IPV6 */
if (!data->ipv6) { if (!data->ipv6) {
struct sockaddr_in *from4 = (struct sockaddr_in *) &from; os_strlcpy(abuf, inet_ntoa(from.sin.sin_addr), sizeof(abuf));
os_strlcpy(abuf, inet_ntoa(from4->sin_addr), sizeof(abuf)); from_port = ntohs(from.sin.sin_port);
from_port = ntohs(from4->sin_port);
RADIUS_DEBUG("Received %d bytes from %s:%d", RADIUS_DEBUG("Received %d bytes from %s:%d",
len, abuf, from_port); len, abuf, from_port);
client = radius_server_get_client(data, &from4->sin_addr, 0); client = radius_server_get_client(data, &from.sin.sin_addr, 0);
} }
RADIUS_DUMP("Received data", buf, len); RADIUS_DUMP("Received data", buf, len);