lkml.org 
[lkml]   [2020]   [Oct]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.9 043/757] net: Properly typecast int values to set sk_max_pacing_rate
    Date
    From: Ke Li <keli@akamai.com>

    [ Upstream commit 700465fd338fe5df08a1b2e27fa16981f562547f ]

    In setsockopt(SO_MAX_PACING_RATE) on 64bit systems, sk_max_pacing_rate,
    after extended from 'u32' to 'unsigned long', takes unintentionally
    hiked value whenever assigned from an 'int' value with MSB=1, due to
    binary sign extension in promoting s32 to u64, e.g. 0x80000000 becomes
    0xFFFFFFFF80000000.

    Thus inflated sk_max_pacing_rate causes subsequent getsockopt to return
    ~0U unexpectedly. It may also result in increased pacing rate.

    Fix by explicitly casting the 'int' value to 'unsigned int' before
    assigning it to sk_max_pacing_rate, for zero extension to happen.

    Fixes: 76a9ebe811fb ("net: extend sk_pacing_rate to unsigned long")
    Signed-off-by: Ji Li <jli@akamai.com>
    Signed-off-by: Ke Li <keli@akamai.com>
    Reviewed-by: Eric Dumazet <edumazet@google.com>
    Link: https://lore.kernel.org/r/20201022064146.79873-1-keli@akamai.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    net/core/filter.c | 3 ++-
    net/core/sock.c | 2 +-
    2 files changed, 3 insertions(+), 2 deletions(-)

    --- a/net/core/filter.c
    +++ b/net/core/filter.c
    @@ -4354,7 +4354,8 @@ static int _bpf_setsockopt(struct sock *
    cmpxchg(&sk->sk_pacing_status,
    SK_PACING_NONE,
    SK_PACING_NEEDED);
    - sk->sk_max_pacing_rate = (val == ~0U) ? ~0UL : val;
    + sk->sk_max_pacing_rate = (val == ~0U) ?
    + ~0UL : (unsigned int)val;
    sk->sk_pacing_rate = min(sk->sk_pacing_rate,
    sk->sk_max_pacing_rate);
    break;
    --- a/net/core/sock.c
    +++ b/net/core/sock.c
    @@ -1176,7 +1176,7 @@ set_sndbuf:

    case SO_MAX_PACING_RATE:
    {
    - unsigned long ulval = (val == ~0U) ? ~0UL : val;
    + unsigned long ulval = (val == ~0U) ? ~0UL : (unsigned int)val;

    if (sizeof(ulval) != sizeof(val) &&
    optlen >= sizeof(ulval) &&

    \
     
     \ /
      Last update: 2020-10-27 17:11    [W:2.355 / U:3.088 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site