Patch "netlink: fix nla_put_{u8,u16,u32} for KASAN" has been added to the 4.13-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
netlink: fix nla_put_{u8,u16,u32} for KASANto the 4.13-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
netlink-fix-nla_put_-u8-u16-u32-for-kasan.patch
and it can be found in the queue-4.13 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
b4391db42308c9940944b5d7be5ca4b78fb88dd0Mon Sep 17 00:00:00 2001
From: Arnd Bergmann <[email protected]>
Date: Fri, 22 Sep 2017 23:29:19 +0200
Subject: netlink: fix nla_put_{u8,u16,u32} for KASAN
From: Arnd Bergmann <[email protected]>
commit b4391db42308c9940944b5d7be5ca4b78fb88dd0 upstream.
When CONFIG_KASAN is enabled, the "--param asan-stack=1" causes rather large stack frames in some functions. This goes unnoticed normally because CONFIG_FRAME_WARN is disabled with CONFIG_KASAN by default as of commit 3f181b4d8652 ("lib/Kconfig.debug: disable -Wframe-larger-than warnings with KASAN=y").
The kernelci.org build bot however has the warning enabled and that led me to investigate it a little further, as every build produces these warnings:
net/wireless/nl80211.c:4389:1: warning: the frame size of 2240 bytes is larger than 2048 bytes [-Wframe-larger-than=] net/wireless/nl80211.c:1895:1: warning: the frame size of 3776 bytes is larger than 2048 bytes [-Wframe-larger-than=] net/wireless/nl80211.c:1410:1: warning: the frame size of 2208 bytes is larger than 2048 bytes [-Wframe-larger-than=] net/bridge/br_netlink.c:1282:1: warning: the frame size of 2544 bytes is larger than 2048 bytes [-Wframe-larger-than=]
Most of this problem is now solved in gcc-8, which can consolidate the stack slots for the inline function arguments. On older compilers we can add a workaround by declaring a local variable in each function to pass the inline function argument.
--- include/net/netlink.h | 73 +++++++++++++++++++++++++++++++++++++------------- 1 file changed, 55 insertions(+), 18 deletions(-)
include/net/netlink.h +55 -18
@@ -768,7 +768,10 @@ static inline int nla_parse_nested(struc*/ static inline int nla_put_u8 (struct sk_buff *skb,int attrtype,u8 value) { -return nla_put (skb, attrtype,sizeof (u8), &value); +/* temporary variables to work around GCC PR81715 with asan-stack=1 */ +u8 tmp = value; + +return nla_put (skb, attrtype,sizeof (u8), &tmp); }/**
@@ -779,7 +782,9 @@ static inline int nla_put_u8(struct sk_b*/ static inline int nla_put_u16 (struct sk_buff *skb,int attrtype,u16 value) { -return nla_put (skb, attrtype,sizeof (u16), &value); +u16 tmp = value; + +return nla_put (skb, attrtype,sizeof (u16), &tmp); }/**
@@ -790,7 +795,9 @@ static inline int nla_put_u16(struct sk_*/ static inline int nla_put_be16 (struct sk_buff *skb,int attrtype,__be16 value) { -return nla_put (skb, attrtype,sizeof (__be16), &value); +__be16 tmp = value; + +return nla_put (skb, attrtype,sizeof (__be16), &tmp); }/**
@@ -801,7 +808,9 @@ static inline int nla_put_be16(struct sk*/ static inline int nla_put_net16 (struct sk_buff *skb,int attrtype,__be16 value) { -return nla_put_be16 (skb, attrtype |NLA_F_NET_BYTEORDER , value); +__be16 tmp = value; + +return nla_put_be16 (skb, attrtype |NLA_F_NET_BYTEORDER , tmp); }/**
@@ -812,7 +821,9 @@ static inline int nla_put_net16(struct s*/ static inline int nla_put_le16 (struct sk_buff *skb,int attrtype,__le16 value) { -return nla_put (skb, attrtype,sizeof (__le16), &value); +__le16 tmp = value; + +return nla_put (skb, attrtype,sizeof (__le16), &tmp); }/**
@@ -823,7 +834,9 @@ static inline int nla_put_le16(struct sk*/ static inline int nla_put_u32 (struct sk_buff *skb,int attrtype,u32 value) { -return nla_put (skb, attrtype,sizeof (u32), &value); +u32 tmp = value; + +return nla_put (skb, attrtype,sizeof (u32), &tmp); }/**
@@ -834,7 +847,9 @@ static inline int nla_put_u32(struct sk_*/ static inline int nla_put_be32 (struct sk_buff *skb,int attrtype,__be32 value) { -return nla_put (skb, attrtype,sizeof (__be32), &value); +__be32 tmp = value; + +return nla_put (skb, attrtype,sizeof (__be32), &tmp); }/**
@@ -845,7 +860,9 @@ static inline int nla_put_be32(struct sk*/ static inline int nla_put_net32 (struct sk_buff *skb,int attrtype,__be32 value) { -return nla_put_be32 (skb, attrtype |NLA_F_NET_BYTEORDER , value); +__be32 tmp = value; + +return nla_put_be32 (skb, attrtype |NLA_F_NET_BYTEORDER , tmp); }/**
@@ -856,7 +873,9 @@ static inline int nla_put_net32(struct s*/ static inline int nla_put_le32 (struct sk_buff *skb,int attrtype,__le32 value) { -return nla_put (skb, attrtype,sizeof (__le32), &value); +__le32 tmp = value; + +return nla_put (skb, attrtype,sizeof (__le32), &tmp); }/**
@@ -869,7 +888,9 @@ static inline int nla_put_le32(struct skstatic inline int nla_put_u64_64bit (struct sk_buff *skb,int attrtype,u64 value,int padattr) { -return nla_put_64bit (skb, attrtype,sizeof (u64), &value, padattr); +u64 tmp = value; + +return nla_put_64bit (skb, attrtype,sizeof (u64), &tmp, padattr); }/**
@@ -882,7 +903,9 @@ static inline int nla_put_u64_64bit(strustatic inline int nla_put_be64 (struct sk_buff *skb,int attrtype,__be64 value,int padattr) { -return nla_put_64bit (skb, attrtype,sizeof (__be64), &value, padattr); +__be64 tmp = value; + +return nla_put_64bit (skb, attrtype,sizeof (__be64), &tmp, padattr); }/**
@@ -895,7 +918,9 @@ static inline int nla_put_be64(struct skstatic inline int nla_put_net64 (struct sk_buff *skb,int attrtype,__be64 value,int padattr) { -return nla_put_be64 (skb, attrtype |NLA_F_NET_BYTEORDER , value, +__be64 tmp = value; + +return nla_put_be64 (skb, attrtype |NLA_F_NET_BYTEORDER , tmp, padattr); }
@@ -909,7 +934,9 @@ static inline int nla_put_net64(struct sstatic inline int nla_put_le64 (struct sk_buff *skb,int attrtype,__le64 value,int padattr) { -return nla_put_64bit (skb, attrtype,sizeof (__le64), &value, padattr); +__le64 tmp = value; + +return nla_put_64bit (skb, attrtype,sizeof (__le64), &tmp, padattr); }/**
@@ -920,7 +947,9 @@ static inline int nla_put_le64(struct sk*/ static inline int nla_put_s8 (struct sk_buff *skb,int attrtype,s8 value) { -return nla_put (skb, attrtype,sizeof (s8), &value); +s8 tmp = value; + +return nla_put (skb, attrtype,sizeof (s8), &tmp); }/**
@@ -931,7 +960,9 @@ static inline int nla_put_s8(struct sk_b*/ static inline int nla_put_s16 (struct sk_buff *skb,int attrtype,s16 value) { -return nla_put (skb, attrtype,sizeof (s16), &value); +s16 tmp = value; + +return nla_put (skb, attrtype,sizeof (s16), &tmp); }/**
@@ -942,7 +973,9 @@ static inline int nla_put_s16(struct sk_*/ static inline int nla_put_s32 (struct sk_buff *skb,int attrtype,s32 value) { -return nla_put (skb, attrtype,sizeof (s32), &value); +s32 tmp = value; + +return nla_put (skb, attrtype,sizeof (s32), &tmp); }/**
@@ -955,7 +988,9 @@ static inline int nla_put_s32(struct sk_static inline int nla_put_s64 (struct sk_buff *skb,int attrtype,s64 value,int padattr) { -return nla_put_64bit (skb, attrtype,sizeof (s64), &value, padattr); +s64 tmp = value; + +return nla_put_64bit (skb, attrtype,sizeof (s64), &tmp, padattr); }/**
@@ -1005,7 +1040,9 @@ static inline int nla_put_msecs(struct sstatic inline int nla_put_in_addr (struct sk_buff *skb,int attrtype,__be32 addr) { -return nla_put_be32 (skb, attrtype, addr); +__be32 tmp = addr; + +return nla_put_be32 (skb, attrtype, tmp); }/**
Patches currently in stable-queue which might be from [email protected] are
queue-4.13/percpu-make-this_cpu_generic_read-atomic-w.r.t.-interrupts.patch queue-4.13/rocker-fix-rocker_tlv_put_-functions-for-kasan.patch queue-4.13/imx-media-of-avoid-uninitialized-variable-warning.patch queue-4.13/netlink-fix-nla_put_-u8-u16-u32-for-kasan.patch