Skip to content

Commit cbdeaee

Browse files
z00467499amschuma-ntap
authored andcommitted
SUNRPC: Fix null-ptr-deref when xps sysfs alloc failed
There is a null-ptr-deref when xps sysfs alloc failed: BUG: KASAN: null-ptr-deref in sysfs_do_create_link_sd+0x40/0xd0 Read of size 8 at addr 0000000000000030 by task gssproxy/457 CPU: 5 PID: 457 Comm: gssproxy Not tainted 6.0.0-09040-g02357b27ee03 #9 Call Trace: <TASK> dump_stack_lvl+0x34/0x44 kasan_report+0xa3/0x120 sysfs_do_create_link_sd+0x40/0xd0 rpc_sysfs_client_setup+0x161/0x1b0 rpc_new_client+0x3fc/0x6e0 rpc_create_xprt+0x71/0x220 rpc_create+0x1d4/0x350 gssp_rpc_create+0xc3/0x160 set_gssp_clnt+0xbc/0x140 write_gssp+0x116/0x1a0 proc_reg_write+0xd6/0x130 vfs_write+0x177/0x690 ksys_write+0xb9/0x150 do_syscall_64+0x35/0x80 entry_SYSCALL_64_after_hwframe+0x46/0xb0 When the xprt_switch sysfs alloc failed, should not add xprt and switch sysfs to it, otherwise, maybe null-ptr-deref; also initialize the 'xps_sysfs' to NULL to avoid oops when destroy it. Fixes: 2a338a5 ("sunrpc: add a symlink from rpc-client directory to the xprt_switch") Fixes: d408ebe ("sunrpc: add add sysfs directory per xprt under each xprt_switch") Fixes: baea994 ("sunrpc: add xprt_switch direcotry to sunrpc's sysfs") Signed-off-by: Zhang Xiaoxu <zhangxiaoxu5@huawei.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
1 parent e59679f commit cbdeaee

File tree

1 file changed

+10
-2
lines changed

1 file changed

+10
-2
lines changed

net/sunrpc/sysfs.c

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -518,13 +518,16 @@ void rpc_sysfs_client_setup(struct rpc_clnt *clnt,
518518
struct net *net)
519519
{
520520
struct rpc_sysfs_client *rpc_client;
521+
struct rpc_sysfs_xprt_switch *xswitch =
522+
(struct rpc_sysfs_xprt_switch *)xprt_switch->xps_sysfs;
523+
524+
if (!xswitch)
525+
return;
521526

522527
rpc_client = rpc_sysfs_client_alloc(rpc_sunrpc_client_kobj,
523528
net, clnt->cl_clid);
524529
if (rpc_client) {
525530
char name[] = "switch";
526-
struct rpc_sysfs_xprt_switch *xswitch =
527-
(struct rpc_sysfs_xprt_switch *)xprt_switch->xps_sysfs;
528531
int ret;
529532

530533
clnt->cl_sysfs = rpc_client;
@@ -558,6 +561,8 @@ void rpc_sysfs_xprt_switch_setup(struct rpc_xprt_switch *xprt_switch,
558561
rpc_xprt_switch->xprt_switch = xprt_switch;
559562
rpc_xprt_switch->xprt = xprt;
560563
kobject_uevent(&rpc_xprt_switch->kobject, KOBJ_ADD);
564+
} else {
565+
xprt_switch->xps_sysfs = NULL;
561566
}
562567
}
563568

@@ -569,6 +574,9 @@ void rpc_sysfs_xprt_setup(struct rpc_xprt_switch *xprt_switch,
569574
struct rpc_sysfs_xprt_switch *switch_obj =
570575
(struct rpc_sysfs_xprt_switch *)xprt_switch->xps_sysfs;
571576

577+
if (!switch_obj)
578+
return;
579+
572580
rpc_xprt = rpc_sysfs_xprt_alloc(&switch_obj->kobject, xprt, gfp_flags);
573581
if (rpc_xprt) {
574582
xprt->xprt_sysfs = rpc_xprt;

0 commit comments

Comments
 (0)