Skip to content
Permalink
Browse files
netdevice: check for net_device::priv_flags bitfield overflow
We almost ran out of unsigned int bitwidth. Define priv flags and
check for potential overflow in the fashion of netdev_features_t.
Defined this way, priv_flags can be easily expanded later with
just changing its typedef.

Signed-off-by: Alexander Lobakin <alobakin@pm.me>
  • Loading branch information
solbjorn authored and intel-lab-lkp committed Feb 16, 2021
1 parent 09b47c3 commit ab71cd66e7a92a19ed9d78686970702fbbf0cd09
Showing 1 changed file with 72 additions and 63 deletions.
@@ -1527,70 +1527,79 @@ struct net_device_ops {
* @IFF_LIVE_RENAME_OK: rename is allowed while device is up and running
*/
enum netdev_priv_flags {
IFF_802_1Q_VLAN = 1<<0,
IFF_EBRIDGE = 1<<1,
IFF_BONDING = 1<<2,
IFF_ISATAP = 1<<3,
IFF_WAN_HDLC = 1<<4,
IFF_XMIT_DST_RELEASE = 1<<5,
IFF_DONT_BRIDGE = 1<<6,
IFF_DISABLE_NETPOLL = 1<<7,
IFF_MACVLAN_PORT = 1<<8,
IFF_BRIDGE_PORT = 1<<9,
IFF_OVS_DATAPATH = 1<<10,
IFF_TX_SKB_SHARING = 1<<11,
IFF_UNICAST_FLT = 1<<12,
IFF_TEAM_PORT = 1<<13,
IFF_SUPP_NOFCS = 1<<14,
IFF_LIVE_ADDR_CHANGE = 1<<15,
IFF_MACVLAN = 1<<16,
IFF_XMIT_DST_RELEASE_PERM = 1<<17,
IFF_L3MDEV_MASTER = 1<<18,
IFF_NO_QUEUE = 1<<19,
IFF_OPENVSWITCH = 1<<20,
IFF_L3MDEV_SLAVE = 1<<21,
IFF_TEAM = 1<<22,
IFF_RXFH_CONFIGURED = 1<<23,
IFF_PHONY_HEADROOM = 1<<24,
IFF_MACSEC = 1<<25,
IFF_NO_RX_HANDLER = 1<<26,
IFF_FAILOVER = 1<<27,
IFF_FAILOVER_SLAVE = 1<<28,
IFF_L3MDEV_RX_HANDLER = 1<<29,
IFF_LIVE_RENAME_OK = 1<<30,
IFF_802_1Q_VLAN_BIT,
IFF_EBRIDGE_BIT,
IFF_BONDING_BIT,
IFF_ISATAP_BIT,
IFF_WAN_HDLC_BIT,
IFF_XMIT_DST_RELEASE_BIT,
IFF_DONT_BRIDGE_BIT,
IFF_DISABLE_NETPOLL_BIT,
IFF_MACVLAN_PORT_BIT,
IFF_BRIDGE_PORT_BIT,
IFF_OVS_DATAPATH_BIT,
IFF_TX_SKB_SHARING_BIT,
IFF_UNICAST_FLT_BIT,
IFF_TEAM_PORT_BIT,
IFF_SUPP_NOFCS_BIT,
IFF_LIVE_ADDR_CHANGE_BIT,
IFF_MACVLAN_BIT,
IFF_XMIT_DST_RELEASE_PERM_BIT,
IFF_L3MDEV_MASTER_BIT,
IFF_NO_QUEUE_BIT,
IFF_OPENVSWITCH_BIT,
IFF_L3MDEV_SLAVE_BIT,
IFF_TEAM_BIT,
IFF_RXFH_CONFIGURED_BIT,
IFF_PHONY_HEADROOM_BIT,
IFF_MACSEC_BIT,
IFF_NO_RX_HANDLER_BIT,
IFF_FAILOVER_BIT,
IFF_FAILOVER_SLAVE_BIT,
IFF_L3MDEV_RX_HANDLER_BIT,
IFF_LIVE_RENAME_OK_BIT,

NETDEV_PRIV_FLAG_COUNT,
};

#define IFF_802_1Q_VLAN IFF_802_1Q_VLAN
#define IFF_EBRIDGE IFF_EBRIDGE
#define IFF_BONDING IFF_BONDING
#define IFF_ISATAP IFF_ISATAP
#define IFF_WAN_HDLC IFF_WAN_HDLC
#define IFF_XMIT_DST_RELEASE IFF_XMIT_DST_RELEASE
#define IFF_DONT_BRIDGE IFF_DONT_BRIDGE
#define IFF_DISABLE_NETPOLL IFF_DISABLE_NETPOLL
#define IFF_MACVLAN_PORT IFF_MACVLAN_PORT
#define IFF_BRIDGE_PORT IFF_BRIDGE_PORT
#define IFF_OVS_DATAPATH IFF_OVS_DATAPATH
#define IFF_TX_SKB_SHARING IFF_TX_SKB_SHARING
#define IFF_UNICAST_FLT IFF_UNICAST_FLT
#define IFF_TEAM_PORT IFF_TEAM_PORT
#define IFF_SUPP_NOFCS IFF_SUPP_NOFCS
#define IFF_LIVE_ADDR_CHANGE IFF_LIVE_ADDR_CHANGE
#define IFF_MACVLAN IFF_MACVLAN
#define IFF_XMIT_DST_RELEASE_PERM IFF_XMIT_DST_RELEASE_PERM
#define IFF_L3MDEV_MASTER IFF_L3MDEV_MASTER
#define IFF_NO_QUEUE IFF_NO_QUEUE
#define IFF_OPENVSWITCH IFF_OPENVSWITCH
#define IFF_L3MDEV_SLAVE IFF_L3MDEV_SLAVE
#define IFF_TEAM IFF_TEAM
#define IFF_RXFH_CONFIGURED IFF_RXFH_CONFIGURED
#define IFF_PHONY_HEADROOM IFF_PHONY_HEADROOM
#define IFF_MACSEC IFF_MACSEC
#define IFF_NO_RX_HANDLER IFF_NO_RX_HANDLER
#define IFF_FAILOVER IFF_FAILOVER
#define IFF_FAILOVER_SLAVE IFF_FAILOVER_SLAVE
#define IFF_L3MDEV_RX_HANDLER IFF_L3MDEV_RX_HANDLER
#define IFF_LIVE_RENAME_OK IFF_LIVE_RENAME_OK
typedef u32 netdev_priv_flags_t;
static_assert(sizeof(netdev_priv_flags_t) * BITS_PER_BYTE <=
NETDEV_PRIV_FLAG_COUNT);

#define __IFF_BIT(bit) ((netdev_priv_flags_t)1 << (bit))
#define __IFF(name) __IFF_BIT(IFF_##name##_BIT)

#define IFF_802_1Q_VLAN __IFF(802_1Q_VLAN)
#define IFF_EBRIDGE __IFF(EBRIDGE)
#define IFF_BONDING __IFF(BONDING)
#define IFF_ISATAP __IFF(ISATAP)
#define IFF_WAN_HDLC __IFF(WAN_HDLC)
#define IFF_XMIT_DST_RELEASE __IFF(XMIT_DST_RELEASE)
#define IFF_DONT_BRIDGE __IFF(DONT_BRIDGE)
#define IFF_DISABLE_NETPOLL __IFF(DISABLE_NETPOLL)
#define IFF_MACVLAN_PORT __IFF(MACVLAN_PORT)
#define IFF_BRIDGE_PORT __IFF(BRIDGE_PORT)
#define IFF_OVS_DATAPATH __IFF(OVS_DATAPATH)
#define IFF_TX_SKB_SHARING __IFF(TX_SKB_SHARING)
#define IFF_UNICAST_FLT __IFF(UNICAST_FLT)
#define IFF_TEAM_PORT __IFF(TEAM_PORT)
#define IFF_SUPP_NOFCS __IFF(SUPP_NOFCS)
#define IFF_LIVE_ADDR_CHANGE __IFF(LIVE_ADDR_CHANGE)
#define IFF_MACVLAN __IFF(MACVLAN)
#define IFF_XMIT_DST_RELEASE_PERM __IFF(XMIT_DST_RELEASE_PERM)
#define IFF_L3MDEV_MASTER __IFF(L3MDEV_MASTER)
#define IFF_NO_QUEUE __IFF(NO_QUEUE)
#define IFF_OPENVSWITCH __IFF(OPENVSWITCH)
#define IFF_L3MDEV_SLAVE __IFF(L3MDEV_SLAVE)
#define IFF_TEAM __IFF(TEAM)
#define IFF_RXFH_CONFIGURED __IFF(RXFH_CONFIGURED)
#define IFF_PHONY_HEADROOM __IFF(PHONY_HEADROOM)
#define IFF_MACSEC __IFF(MACSEC)
#define IFF_NO_RX_HANDLER __IFF(NO_RX_HANDLER)
#define IFF_FAILOVER __IFF(FAILOVER)
#define IFF_FAILOVER_SLAVE __IFF(FAILOVER_SLAVE)
#define IFF_L3MDEV_RX_HANDLER __IFF(L3MDEV_RX_HANDLER)
#define IFF_LIVE_RENAME_OK __IFF(LIVE_RENAME_OK)

/**
* struct net_device - The DEVICE structure.
@@ -1925,7 +1934,7 @@ struct net_device {
const struct header_ops *header_ops;

unsigned int flags;
unsigned int priv_flags;
netdev_priv_flags_t priv_flags;

unsigned short gflags;
unsigned short padded;

0 comments on commit ab71cd6

Please sign in to comment.