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 089/105] rocker: fix rocker_tlv_put_* functions for KASAN
    Date
    4.9-stable review patch.  If anyone has any objections, please let me know.

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

    From: Arnd Bergmann <arnd@arndb.de>

    commit 6098d7ddd62f532f80ee2a4b01aca500a8e4e9e4 upstream.

    Inlining these functions creates lots of stack variables that each take
    64 bytes when KASAN is enabled, leading to this warning about potential
    stack overflow:

    drivers/net/ethernet/rocker/rocker_ofdpa.c: In function 'ofdpa_cmd_flow_tbl_add':
    drivers/net/ethernet/rocker/rocker_ofdpa.c:621:1: error: the frame size of 2752 bytes is larger than 1536 bytes [-Werror=frame-larger-than=]

    gcc-8 can now consolidate the stack slots itself, but on older versions
    we get the same behavior by using a temporary variable that holds a
    copy of 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>

    ---
    drivers/net/ethernet/rocker/rocker_tlv.h | 48 +++++++++++++++++++------------
    1 file changed, 30 insertions(+), 18 deletions(-)

    --- a/drivers/net/ethernet/rocker/rocker_tlv.h
    +++ b/drivers/net/ethernet/rocker/rocker_tlv.h
    @@ -139,40 +139,52 @@ rocker_tlv_start(struct rocker_desc_info
    int rocker_tlv_put(struct rocker_desc_info *desc_info,
    int attrtype, int attrlen, const void *data);

    -static inline int rocker_tlv_put_u8(struct rocker_desc_info *desc_info,
    - int attrtype, u8 value)
    +static inline int
    +rocker_tlv_put_u8(struct rocker_desc_info *desc_info, int attrtype, u8 value)
    {
    - return rocker_tlv_put(desc_info, attrtype, sizeof(u8), &value);
    + u8 tmp = value; /* work around GCC PR81715 */
    +
    + return rocker_tlv_put(desc_info, attrtype, sizeof(u8), &tmp);
    }

    -static inline int rocker_tlv_put_u16(struct rocker_desc_info *desc_info,
    - int attrtype, u16 value)
    +static inline int
    +rocker_tlv_put_u16(struct rocker_desc_info *desc_info, int attrtype, u16 value)
    {
    - return rocker_tlv_put(desc_info, attrtype, sizeof(u16), &value);
    + u16 tmp = value;
    +
    + return rocker_tlv_put(desc_info, attrtype, sizeof(u16), &tmp);
    }

    -static inline int rocker_tlv_put_be16(struct rocker_desc_info *desc_info,
    - int attrtype, __be16 value)
    +static inline int
    +rocker_tlv_put_be16(struct rocker_desc_info *desc_info, int attrtype, __be16 value)
    {
    - return rocker_tlv_put(desc_info, attrtype, sizeof(__be16), &value);
    + __be16 tmp = value;
    +
    + return rocker_tlv_put(desc_info, attrtype, sizeof(__be16), &tmp);
    }

    -static inline int rocker_tlv_put_u32(struct rocker_desc_info *desc_info,
    - int attrtype, u32 value)
    +static inline int
    +rocker_tlv_put_u32(struct rocker_desc_info *desc_info, int attrtype, u32 value)
    {
    - return rocker_tlv_put(desc_info, attrtype, sizeof(u32), &value);
    + u32 tmp = value;
    +
    + return rocker_tlv_put(desc_info, attrtype, sizeof(u32), &tmp);
    }

    -static inline int rocker_tlv_put_be32(struct rocker_desc_info *desc_info,
    - int attrtype, __be32 value)
    +static inline int
    +rocker_tlv_put_be32(struct rocker_desc_info *desc_info, int attrtype, __be32 value)
    {
    - return rocker_tlv_put(desc_info, attrtype, sizeof(__be32), &value);
    + __be32 tmp = value;
    +
    + return rocker_tlv_put(desc_info, attrtype, sizeof(__be32), &tmp);
    }

    -static inline int rocker_tlv_put_u64(struct rocker_desc_info *desc_info,
    - int attrtype, u64 value)
    +static inline int
    +rocker_tlv_put_u64(struct rocker_desc_info *desc_info, int attrtype, u64 value)
    {
    - return rocker_tlv_put(desc_info, attrtype, sizeof(u64), &value);
    + u64 tmp = value;
    +
    + return rocker_tlv_put(desc_info, attrtype, sizeof(u64), &tmp);
    }

    static inline struct rocker_tlv *

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