netrom: Fix data-races around sysctl_netrom_network_ttl_initialiser
authorJason Xing <kernelxing@tencent.com>
Mon, 4 Mar 2024 08:20:37 +0000 (16:20 +0800)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 7 Mar 2024 09:36:58 +0000 (10:36 +0100)
We need to protect the reader reading the sysctl value because the
value can be changed concurrently.

Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
Signed-off-by: Jason Xing <kernelxing@tencent.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
net/netrom/nr_dev.c
net/netrom/nr_out.c
net/netrom/nr_subr.c

index 3aaac4a..2c34389 100644 (file)
@@ -81,7 +81,7 @@ static int nr_header(struct sk_buff *skb, struct net_device *dev,
        buff[6] |= AX25_SSSID_SPARE;
        buff    += AX25_ADDR_LEN;
 
-       *buff++ = sysctl_netrom_network_ttl_initialiser;
+       *buff++ = READ_ONCE(sysctl_netrom_network_ttl_initialiser);
 
        *buff++ = NR_PROTO_IP;
        *buff++ = NR_PROTO_IP;
index 4492965..5e53139 100644 (file)
@@ -204,7 +204,7 @@ void nr_transmit_buffer(struct sock *sk, struct sk_buff *skb)
        dptr[6] |= AX25_SSSID_SPARE;
        dptr += AX25_ADDR_LEN;
 
-       *dptr++ = sysctl_netrom_network_ttl_initialiser;
+       *dptr++ = READ_ONCE(sysctl_netrom_network_ttl_initialiser);
 
        if (!nr_route_frame(skb, NULL)) {
                kfree_skb(skb);
index e2d2af9..c3bbd58 100644 (file)
@@ -182,7 +182,8 @@ void nr_write_internal(struct sock *sk, int frametype)
                *dptr++ = nr->my_id;
                *dptr++ = frametype;
                *dptr++ = nr->window;
-               if (nr->bpqext) *dptr++ = sysctl_netrom_network_ttl_initialiser;
+               if (nr->bpqext)
+                       *dptr++ = READ_ONCE(sysctl_netrom_network_ttl_initialiser);
                break;
 
        case NR_DISCREQ:
@@ -236,7 +237,7 @@ void __nr_transmit_reply(struct sk_buff *skb, int mine, unsigned char cmdflags)
        dptr[6] |= AX25_SSSID_SPARE;
        dptr += AX25_ADDR_LEN;
 
-       *dptr++ = sysctl_netrom_network_ttl_initialiser;
+       *dptr++ = READ_ONCE(sysctl_netrom_network_ttl_initialiser);
 
        if (mine) {
                *dptr++ = 0;