Skip to content

Commit b49ea67

Browse files
neilbrownamschuma-ntap
authored andcommitted
SUNRPC: lock against ->sock changing during sysfs read
->sock can be set to NULL asynchronously unless ->recv_mutex is held. So it is important to hold that mutex. Otherwise a sysfs read can trigger an oops. Commit 17f09d3 ("SUNRPC: Check if the xprt is connected before handling sysfs reads") appears to attempt to fix this problem, but it only narrows the race window. Fixes: 17f09d3 ("SUNRPC: Check if the xprt is connected before handling sysfs reads") Fixes: a848248 ("SUNRPC query transport's source port") Signed-off-by: NeilBrown <neilb@suse.de> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
1 parent 63db37e commit b49ea67

File tree

2 files changed

+10
-2
lines changed

2 files changed

+10
-2
lines changed

net/sunrpc/sysfs.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,11 +115,14 @@ static ssize_t rpc_sysfs_xprt_srcaddr_show(struct kobject *kobj,
115115
}
116116

117117
sock = container_of(xprt, struct sock_xprt, xprt);
118-
if (kernel_getsockname(sock->sock, (struct sockaddr *)&saddr) < 0)
118+
mutex_lock(&sock->recv_mutex);
119+
if (sock->sock == NULL ||
120+
kernel_getsockname(sock->sock, (struct sockaddr *)&saddr) < 0)
119121
goto out;
120122

121123
ret = sprintf(buf, "%pISc\n", &saddr);
122124
out:
125+
mutex_unlock(&sock->recv_mutex);
123126
xprt_put(xprt);
124127
return ret + 1;
125128
}

net/sunrpc/xprtsock.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1641,7 +1641,12 @@ static int xs_get_srcport(struct sock_xprt *transport)
16411641
unsigned short get_srcport(struct rpc_xprt *xprt)
16421642
{
16431643
struct sock_xprt *sock = container_of(xprt, struct sock_xprt, xprt);
1644-
return xs_sock_getport(sock->sock);
1644+
unsigned short ret = 0;
1645+
mutex_lock(&sock->recv_mutex);
1646+
if (sock->sock)
1647+
ret = xs_sock_getport(sock->sock);
1648+
mutex_unlock(&sock->recv_mutex);
1649+
return ret;
16451650
}
16461651
EXPORT_SYMBOL(get_srcport);
16471652

0 commit comments

Comments
 (0)