]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
Work around some gcc 4.4 strict-aliasing warnings
authorJouni Malinen <j@w1.fi>
Wed, 4 Nov 2009 17:49:14 +0000 (19:49 +0200)
committerJouni Malinen <j@w1.fi>
Wed, 4 Nov 2009 17:49:14 +0000 (19:49 +0200)
gcc 4.4 ends up generating strict-aliasing warnings about some very common
networking socket uses that do not really result in a real problem and
cannot be easily avoided with union-based type-punning due to struct
definitions including another struct in system header files. To avoid having
to fully disable strict-aliasing warnings, provide a mechanism to hide the
typecast from aliasing for now. A cleaner solution will hopefully be found
in the future to handle these cases.

src/drivers/driver_nl80211.c
src/drivers/driver_wext.c
src/l2_packet/l2_packet_linux.c
src/utils/common.c
src/utils/common.h
src/wps/wps_upnp_ssdp.c

index b3861f5beb7626b8a169d5e3a02c3327f558e9f4..626d74fb7fe8ad6a8cdfd57a1575f645805ab3fc 100644 (file)
@@ -356,8 +356,9 @@ static int wpa_driver_nl80211_send_oper_ifla(
        req.ifinfo.ifi_change = 0;
 
        if (linkmode != -1) {
-               rta = (struct rtattr *)
-                       ((char *) &req + NLMSG_ALIGN(req.hdr.nlmsg_len));
+               rta = aliasing_hide_typecast(
+                       ((char *) &req + NLMSG_ALIGN(req.hdr.nlmsg_len)),
+                       struct rtattr);
                rta->rta_type = IFLA_LINKMODE;
                rta->rta_len = RTA_LENGTH(sizeof(char));
                *((char *) RTA_DATA(rta)) = linkmode;
index ade8904cefcf543e979cf83dcc9f34775a5111d5..a291813bbce44ca91e641489ae6c83209577e61b 100644 (file)
@@ -65,8 +65,9 @@ static int wpa_driver_wext_send_oper_ifla(struct wpa_driver_wext_data *drv,
        req.ifinfo.ifi_change = 0;
 
        if (linkmode != -1) {
-               rta = (struct rtattr *)
-                       ((char *) &req + NLMSG_ALIGN(req.hdr.nlmsg_len));
+               rta = aliasing_hide_typecast(
+                       ((char *) &req + NLMSG_ALIGN(req.hdr.nlmsg_len)),
+                       struct rtattr);
                rta->rta_type = IFLA_LINKMODE;
                rta->rta_len = RTA_LENGTH(sizeof(char));
                *((char *) RTA_DATA(rta)) = linkmode;
index fb357705eecb1c2299d5a8c1cbb8a7f218b73d80..48d1bde024e240fab2c77f07c5f84be4c703171e 100644 (file)
@@ -185,7 +185,7 @@ int l2_packet_get_ip_addr(struct l2_packet_data *l2, char *buf, size_t len)
                return -1;
        }
        close(s);
-       saddr = (struct sockaddr_in *) &ifr.ifr_addr;
+       saddr = aliasing_hide_typecast(&ifr.ifr_addr, struct sockaddr_in);
        if (saddr->sin_family != AF_INET)
                return -1;
        res = os_strlcpy(buf, inet_ntoa(saddr->sin_addr), len);
index cb373c3debab8db7738e2025f70d1aad85ca87fd..9a46ebe461da50203ad30624eea55b67dcbf2668 100644 (file)
@@ -325,3 +325,9 @@ const char * wpa_ssid_txt(const u8 *ssid, size_t ssid_len)
        }
        return ssid_txt;
 }
+
+
+void * __hide_aliasing_typecast(void *foo)
+{
+       return foo;
+}
index e6a0f899d8674e6b6d76088ab2eb9fd2c7e41900..d649391e37b68cfb19996ca939d8f46fd404bced 100644 (file)
@@ -442,4 +442,17 @@ static inline int is_zero_ether_addr(const u8 *a)
 
 #include "wpa_debug.h"
 
+
+/*
+ * gcc 4.4 ends up generating strict-aliasing warnings about some very common
+ * networking socket uses that do not really result in a real problem and
+ * cannot be easily avoided with union-based type-punning due to struct
+ * definitions including another struct in system header files. To avoid having
+ * to fully disable strict-aliasing warnings, provide a mechanism to hide the
+ * typecast from aliasing for now. A cleaner solution will hopefully be found
+ * in the future to handle these cases.
+ */
+void * __hide_aliasing_typecast(void *foo);
+#define aliasing_hide_typecast(a,t) (t *) __hide_aliasing_typecast((a))
+
 #endif /* COMMON_H */
index 47be4769cd669822e8107943cbfd9c2b90165bdf..92b785c444ae7279d160885e0a25a7fa6f6db6d4 100644 (file)
@@ -799,11 +799,11 @@ int add_ssdp_network(char *net_if)
                goto fail;
 
        rt.rt_dev = net_if;
-       sin = (struct sockaddr_in *) &rt.rt_dst;
+       sin = aliasing_hide_typecast(&rt.rt_dst, struct sockaddr_in);
        sin->sin_family = AF_INET;
        sin->sin_port = 0;
        sin->sin_addr.s_addr = inet_addr(SSDP_TARGET);
-       sin = (struct sockaddr_in *) &rt.rt_genmask;
+       sin = aliasing_hide_typecast(&rt.rt_genmask, struct sockaddr_in);
        sin->sin_family = AF_INET;
        sin->sin_port = 0;
        sin->sin_addr.s_addr = inet_addr(SSDP_NETMASK);