This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH] Fix strict-aliasing warning in resolv/res_hconf.c
- From: Steve Ellcey <sellcey at imgtec dot com>
- To: Florian Weimer <fweimer at redhat dot com>
- Cc: Andreas Schwab <schwab at suse dot de>, Roland McGrath <roland at hack dot frob dot com>, Paul Eggert <eggert at cs dot ucla dot edu>, <libc-alpha at sourceware dot org>
- Date: Wed, 20 May 2015 09:27:20 -0700
- Subject: Re: [PATCH] Fix strict-aliasing warning in resolv/res_hconf.c
- Authentication-results: sourceware.org; auth=none
- References: <5bfa6373-3817-4d31-a5ee-a8676e79b723 at BAMAIL02 dot ba dot imgtec dot org> <555BB55E dot 3050304 at cs dot ucla dot edu> <1432075989 dot 16668 dot 62 dot camel at ubuntu-sellcey> <555BC19B dot 90001 at cs dot ucla dot edu> <1432077972 dot 16668 dot 65 dot camel at ubuntu-sellcey> <20150519235817 dot 9516F2C3A73 at topped-with-meat dot com> <555C3E0B dot 2040404 at redhat dot com> <mvma8wzbqsv dot fsf at hawking dot suse dot de> <555C48F0 dot 2030208 at redhat dot com>
- Reply-to: <sellcey at imgtec dot com>
On Wed, 2015-05-20 at 10:42 +0200, Florian Weimer wrote:
> On 05/20/2015 10:23 AM, Andreas Schwab wrote:
> > Florian Weimer <fweimer@redhat.com> writes:
> >
> >> Looking at struct ifreq, it is rather mysterious to me how this is
> >> supposed to work at all. I mean, struct sockaddr has just 14 bytes
> >> storage for address information, but IPv6 addresses need 16 bytes, and
> >> socket addresses contain even more information than a raw address.
> >
> > This ioctl is only defined for IPv4.
>
> Oh, but then we can add a union member of the appropriate type (just one
> is needed):
>
> diff --git a/sysdeps/gnu/net/if.h b/sysdeps/gnu/net/if.h
> index 49a048c..39f40de 100644
> --- a/sysdeps/gnu/net/if.h
> +++ b/sysdeps/gnu/net/if.h
> @@ -24,6 +24,7 @@
> #ifdef __USE_MISC
> # include <sys/types.h>
> # include <sys/socket.h>
> +# include <netinet/in.h>
> #endif
>
>
> @@ -139,6 +140,7 @@ struct ifreq
> struct sockaddr ifru_broadaddr;
> struct sockaddr ifru_netmask;
> struct sockaddr ifru_hwaddr;
> + struct sockaddr_in ifru_addr_in;
> short int ifru_flags;
> int ifru_ivalue;
> int ifru_mtu;
>
>
> This doesn't change ABI. And then the code in resolv/res_hconf.c could
> use that new member, without any casts.
I don't know if this change is going to be considered acceptable or not
but here is a complete patch with the new union member, a macro
definition to access it (in order to match the other union members) and
the needed change to resolv/res_hconf.c.
Steve Ellcey
sellcey@imgtec.com
2015-05-20 Steve Ellcey <sellcey@imgtec.com>
Florian Weimer <fweimer@redhat.com>
* resolv/res_hconf.c (_res_hconf_reorder_addrs): Use new ifr_addr_in
name to access address.
* sysdeps/gnu/net/if.h (struct ifreq): Add new ifru_addr_in union
member.
(ifr_addr_in): New macro.
diff --git a/resolv/res_hconf.c b/resolv/res_hconf.c
index 73942e8..3b05287 100644
--- a/resolv/res_hconf.c
+++ b/resolv/res_hconf.c
@@ -444,13 +444,13 @@ _res_hconf_reorder_addrs (struct hostent *hp)
ifaddrs[new_num_ifs].addrtype = AF_INET;
ifaddrs[new_num_ifs].u.ipv4.addr =
- ((struct sockaddr_in *) &cur_ifr->ifr_addr)->sin_addr.s_addr;
+ cur_ifr->ifr_addr_in.sin_addr.s_addr;
if (__ioctl (sd, SIOCGIFNETMASK, cur_ifr) < 0)
continue;
ifaddrs[new_num_ifs].u.ipv4.mask =
- ((struct sockaddr_in *) &cur_ifr->ifr_netmask)->sin_addr.s_addr;
+ cur_ifr->ifr_addr_in.sin_addr.s_addr;
/* Now we're committed to this entry. */
++new_num_ifs;
diff --git a/sysdeps/gnu/net/if.h b/sysdeps/gnu/net/if.h
index 49a048c..b741d14 100644
--- a/sysdeps/gnu/net/if.h
+++ b/sysdeps/gnu/net/if.h
@@ -24,6 +24,7 @@
#ifdef __USE_MISC
# include <sys/types.h>
# include <sys/socket.h>
+# include <netinet/in.h>
#endif
@@ -139,6 +140,7 @@ struct ifreq
struct sockaddr ifru_broadaddr;
struct sockaddr ifru_netmask;
struct sockaddr ifru_hwaddr;
+ struct sockaddr_in ifru_addr_in;
short int ifru_flags;
int ifru_ivalue;
int ifru_mtu;
@@ -151,6 +153,7 @@ struct ifreq
# define ifr_name ifr_ifrn.ifrn_name /* interface name */
# define ifr_hwaddr ifr_ifru.ifru_hwaddr /* MAC address */
# define ifr_addr ifr_ifru.ifru_addr /* address */
+# define ifr_addr_in ifr_ifru.ifru_addr_in /* sockaddr_in address */
# define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-p lnk */
# define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */
# define ifr_netmask ifr_ifru.ifru_netmask /* interface net mask */