Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit acc653e8 authored by Jason Xing's avatar Jason Xing Committed by Sasha Levin
Browse files

netrom: Fix data-races around sysctl_netrom_network_ttl_initialiser



[ Upstream commit 119cae5ea3f9e35cdada8e572cc067f072fa825a ]

We need to protect the reader reading the sysctl value because the
value can be changed concurrently.

Fixes: 1da177e4 ("Linux-2.6.12-rc2")
Signed-off-by: default avatarJason Xing <kernelxing@tencent.com>
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent e3a3718b
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -84,7 +84,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;
+1 −1
Original line number Diff line number Diff line
@@ -207,7 +207,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);
+3 −2
Original line number Diff line number Diff line
@@ -185,7 +185,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:
@@ -239,7 +240,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;