Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

netrom: Fix data-races around sysctl_netrom_network_ttl_initialiser

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>

authored by

Jason Xing and committed by
Paolo Abeni
119cae5e cfd9f4a7

+5 -4
+1 -1
net/netrom/nr_dev.c
··· 81 81 buff[6] |= AX25_SSSID_SPARE; 82 82 buff += AX25_ADDR_LEN; 83 83 84 - *buff++ = sysctl_netrom_network_ttl_initialiser; 84 + *buff++ = READ_ONCE(sysctl_netrom_network_ttl_initialiser); 85 85 86 86 *buff++ = NR_PROTO_IP; 87 87 *buff++ = NR_PROTO_IP;
+1 -1
net/netrom/nr_out.c
··· 204 204 dptr[6] |= AX25_SSSID_SPARE; 205 205 dptr += AX25_ADDR_LEN; 206 206 207 - *dptr++ = sysctl_netrom_network_ttl_initialiser; 207 + *dptr++ = READ_ONCE(sysctl_netrom_network_ttl_initialiser); 208 208 209 209 if (!nr_route_frame(skb, NULL)) { 210 210 kfree_skb(skb);
+3 -2
net/netrom/nr_subr.c
··· 182 182 *dptr++ = nr->my_id; 183 183 *dptr++ = frametype; 184 184 *dptr++ = nr->window; 185 - if (nr->bpqext) *dptr++ = sysctl_netrom_network_ttl_initialiser; 185 + if (nr->bpqext) 186 + *dptr++ = READ_ONCE(sysctl_netrom_network_ttl_initialiser); 186 187 break; 187 188 188 189 case NR_DISCREQ: ··· 237 236 dptr[6] |= AX25_SSSID_SPARE; 238 237 dptr += AX25_ADDR_LEN; 239 238 240 - *dptr++ = sysctl_netrom_network_ttl_initialiser; 239 + *dptr++ = READ_ONCE(sysctl_netrom_network_ttl_initialiser); 241 240 242 241 if (mine) { 243 242 *dptr++ = 0;