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 3aaac4a22b38763cd855e494b2c19fdf3bcbd54e..2c34389c3ce6f16acf669fa14c7b38a7d63dda4b 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 44929657f5b717de639c13334f17f42f652a78cc..5e531394a724b7f919f22ae2be42c8feaafdc22e 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 e2d2af924cff4a4103e59e04a6efe69c6fcca23e..c3bbd5880850bb047c7375e2c1b8acf6e80e0231 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;