lkml.org 
[lkml]   [2022]   [Jul]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.18 115/158] ip: Fix data-races around sysctl_ip_prot_sock.
    Date
    From: Kuniyuki Iwashima <kuniyu@amazon.com>

    [ Upstream commit 9b55c20f83369dd54541d9ddbe3a018a8377f451 ]

    sysctl_ip_prot_sock is accessed concurrently, and there is always a chance
    of data-race. So, all readers and writers need some basic protection to
    avoid load/store-tearing.

    Fixes: 4548b683b781 ("Introduce a sysctl that modifies the value of PROT_SOCK.")
    Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    include/net/ip.h | 2 +-
    net/ipv4/sysctl_net_ipv4.c | 6 +++---
    2 files changed, 4 insertions(+), 4 deletions(-)

    diff --git a/include/net/ip.h b/include/net/ip.h
    index 4a15b6bcb4b8..1c979fd1904c 100644
    --- a/include/net/ip.h
    +++ b/include/net/ip.h
    @@ -357,7 +357,7 @@ static inline bool sysctl_dev_name_is_allowed(const char *name)

    static inline bool inet_port_requires_bind_service(struct net *net, unsigned short port)
    {
    - return port < net->ipv4.sysctl_ip_prot_sock;
    + return port < READ_ONCE(net->ipv4.sysctl_ip_prot_sock);
    }

    #else
    diff --git a/net/ipv4/sysctl_net_ipv4.c b/net/ipv4/sysctl_net_ipv4.c
    index 6b718688865e..344cdcd5a7d5 100644
    --- a/net/ipv4/sysctl_net_ipv4.c
    +++ b/net/ipv4/sysctl_net_ipv4.c
    @@ -88,7 +88,7 @@ static int ipv4_local_port_range(struct ctl_table *table, int write,
    * port limit.
    */
    if ((range[1] < range[0]) ||
    - (range[0] < net->ipv4.sysctl_ip_prot_sock))
    + (range[0] < READ_ONCE(net->ipv4.sysctl_ip_prot_sock)))
    ret = -EINVAL;
    else
    set_local_port_range(net, range);
    @@ -114,7 +114,7 @@ static int ipv4_privileged_ports(struct ctl_table *table, int write,
    .extra2 = &ip_privileged_port_max,
    };

    - pports = net->ipv4.sysctl_ip_prot_sock;
    + pports = READ_ONCE(net->ipv4.sysctl_ip_prot_sock);

    ret = proc_dointvec_minmax(&tmp, write, buffer, lenp, ppos);

    @@ -126,7 +126,7 @@ static int ipv4_privileged_ports(struct ctl_table *table, int write,
    if (range[0] < pports)
    ret = -EINVAL;
    else
    - net->ipv4.sysctl_ip_prot_sock = pports;
    + WRITE_ONCE(net->ipv4.sysctl_ip_prot_sock, pports);
    }

    return ret;
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-07-27 19:43    [W:4.103 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site