lkml.org 
[lkml]   [2019]   [Jun]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 185/241] tipc: Avoid copying bytes beyond the supplied data
    Date
    From: Chris Packham <chris.packham@alliedtelesis.co.nz>

    TLV_SET is called with a data pointer and a len parameter that tells us
    how many bytes are pointed to by data. When invoking memcpy() we need
    to careful to only copy len bytes.

    Previously we would copy TLV_LENGTH(len) bytes which would copy an extra
    4 bytes past the end of the data pointer which newer GCC versions
    complain about.

    In file included from test.c:17:
    In function 'TLV_SET',
    inlined from 'test' at test.c:186:5:
    /usr/include/linux/tipc_config.h:317:3:
    warning: 'memcpy' forming offset [33, 36] is out of the bounds [0, 32]
    of object 'bearer_name' with type 'char[32]' [-Warray-bounds]
    memcpy(TLV_DATA(tlv_ptr), data, tlv_len);
    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    test.c: In function 'test':
    test.c::161:10: note:
    'bearer_name' declared here
    char bearer_name[TIPC_MAX_BEARER_NAME];
    ^~~~~~~~~~~

    We still want to ensure any padding bytes at the end are initialised, do
    this with a explicit memset() rather than copy bytes past the end of
    data. Apply the same logic to TCM_SET.

    Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    include/uapi/linux/tipc_config.h | 10 +++++++---
    1 file changed, 7 insertions(+), 3 deletions(-)

    --- a/include/uapi/linux/tipc_config.h
    +++ b/include/uapi/linux/tipc_config.h
    @@ -301,8 +301,10 @@ static inline int TLV_SET(void *tlv, __u
    tlv_ptr = (struct tlv_desc *)tlv;
    tlv_ptr->tlv_type = htons(type);
    tlv_ptr->tlv_len = htons(tlv_len);
    - if (len && data)
    - memcpy(TLV_DATA(tlv_ptr), data, tlv_len);
    + if (len && data) {
    + memcpy(TLV_DATA(tlv_ptr), data, len);
    + memset(TLV_DATA(tlv_ptr) + len, 0, TLV_SPACE(len) - tlv_len);
    + }
    return TLV_SPACE(len);
    }

    @@ -399,8 +401,10 @@ static inline int TCM_SET(void *msg, __u
    tcm_hdr->tcm_len = htonl(msg_len);
    tcm_hdr->tcm_type = htons(cmd);
    tcm_hdr->tcm_flags = htons(flags);
    - if (data_len && data)
    + if (data_len && data) {
    memcpy(TCM_DATA(msg), data, data_len);
    + memset(TCM_DATA(msg) + data_len, 0, TCM_SPACE(data_len) - msg_len);
    + }
    return TCM_SPACE(data_len);
    }


    \
     
     \ /
      Last update: 2019-06-09 19:09    [W:5.437 / U:0.088 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site