Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 30 Mar 2018 21:38:53 +0000 (UTC)
From:      Brooks Davis <brooks@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r331831 - in head/sys: net netinet6
Message-ID:  <201803302138.w2ULcrjl072844@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: brooks
Date: Fri Mar 30 21:38:53 2018
New Revision: 331831
URL: https://svnweb.freebsd.org/changeset/base/331831

Log:
  Document and enforce assumptions about struct (in6_)ifreq.
  
  - The two types must be type-punnable for shared members of ifr_ifru.
    This allows compatibility accessors to be shared.
  
  - There must be no padding gap between ifr_name and ifr_ifru.  This is
    assumed in tcpdump's use of SIOCGIFFLAGS output which attempts to be
    broadly portable.  This is true for all current architectures, but very
    large (256-bit) fat-pointers could violate this invariant.
  
  Reviewed by:	kib
  Obtained from:	CheriBSD
  Sponsored by:	DARPA, AFRL
  Differential Revision:	https://reviews.freebsd.org/D14910

Modified:
  head/sys/net/if.c
  head/sys/netinet6/in6.c

Modified: head/sys/net/if.c
==============================================================================
--- head/sys/net/if.c	Fri Mar 30 20:27:47 2018	(r331830)
+++ head/sys/net/if.c	Fri Mar 30 21:38:53 2018	(r331831)
@@ -97,6 +97,13 @@
 
 #include <security/mac/mac_framework.h>
 
+/*
+ * Consumers of struct ifreq such as tcpdump assume no pad between ifr_name
+ * and ifr_ifru when it is used in SIOCGIFCONF.
+ */
+_Static_assert(sizeof(((struct ifreq *)0)->ifr_name) ==
+    offsetof(struct ifreq, ifr_ifru), "gap between ifr_name and ifr_ifru");
+
 #ifdef COMPAT_FREEBSD32
 #include <sys/mount.h>
 #include <compat/freebsd32/freebsd32.h>

Modified: head/sys/netinet6/in6.c
==============================================================================
--- head/sys/netinet6/in6.c	Fri Mar 30 20:27:47 2018	(r331830)
+++ head/sys/netinet6/in6.c	Fri Mar 30 21:38:53 2018	(r331831)
@@ -112,6 +112,14 @@ __FBSDID("$FreeBSD$");
 #include <netinet6/in6_fib.h>
 #include <netinet6/in6_pcb.h>
 
+/*
+ * struct in6_ifreq and struct ifreq must be type punnable for common members
+ * of ifr_ifru to allow accessors to be shared.
+ */
+_Static_assert(offsetof(struct in6_ifreq, ifr_ifru) ==
+    offsetof(struct ifreq, ifr_ifru),
+    "struct in6_ifreq and struct ifreq are not type punnable");
+
 VNET_DECLARE(int, icmp6_nodeinfo_oldmcprefix);
 #define V_icmp6_nodeinfo_oldmcprefix	VNET(icmp6_nodeinfo_oldmcprefix)
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201803302138.w2ULcrjl072844>