lkml.org 
[lkml]   [2017]   [Oct]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.9 090/105] netlink: fix nla_put_{u8,u16,u32} for KASAN
    Date
    4.9-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Arnd Bergmann <arnd@arndb.de>

    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.

    Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=81715
    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    include/net/netlink.h | 73 +++++++++++++++++++++++++++++++++++++-------------
    1 file changed, 55 insertions(+), 18 deletions(-)

    --- a/include/net/netlink.h
    +++ b/include/net/netlink.h
    @@ -756,7 +756,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);
    }

    /**
    @@ -767,7 +770,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);
    }

    /**
    @@ -778,7 +783,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);
    }

    /**
    @@ -789,7 +796,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);
    }

    /**
    @@ -800,7 +809,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);
    }

    /**
    @@ -811,7 +822,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);
    }

    /**
    @@ -822,7 +835,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);
    }

    /**
    @@ -833,7 +848,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);
    }

    /**
    @@ -844,7 +861,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);
    }

    /**
    @@ -857,7 +876,9 @@ static inline int nla_put_le32(struct sk
    static 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);
    }

    /**
    @@ -870,7 +891,9 @@ static inline int nla_put_u64_64bit(stru
    static 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);
    }

    /**
    @@ -883,7 +906,9 @@ static inline int nla_put_be64(struct sk
    static 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);
    }

    @@ -897,7 +922,9 @@ static inline int nla_put_net64(struct s
    static 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);
    }

    /**
    @@ -908,7 +935,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);
    }

    /**
    @@ -919,7 +948,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);
    }

    /**
    @@ -930,7 +961,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);
    }

    /**
    @@ -943,7 +976,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);
    }

    /**
    @@ -993,7 +1028,9 @@ static inline int nla_put_msecs(struct s
    static 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);
    }

    /**

    \
     
     \ /
      Last update: 2017-10-10 21:59    [W:4.253 / U:0.104 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site