Skip to content

Commit a749447

Browse files
Greg Jumpergregkh
authored andcommitted
net/rds: Restrict use of RDS/IB to the initial network namespace
[ Upstream commit ebf71dd ] Prevent using RDS/IB in network namespaces other than the initial one. The existing RDS/IB code will not work properly in non-initial network namespaces. Fixes: d5a8ac2 ("RDS-TCP: Make RDS-TCP work correctly when it is set up in a netns other than init_net") Reported-by: syzbot+da8e060735ae02c8f3d1@syzkaller.appspotmail.com Closes: https://syzkaller.appspot.com/bug?extid=da8e060735ae02c8f3d1 Signed-off-by: Greg Jumper <greg.jumper@oracle.com> Signed-off-by: Allison Henderson <achender@kernel.org> Link: https://patch.msgid.link/20260408080420.540032-3-achender@kernel.org Signed-off-by: Jakub Kicinski <kuba@kernel.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent d3f880a commit a749447

2 files changed

Lines changed: 12 additions & 2 deletions

File tree

net/rds/af_rds.c

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,8 @@ static int rds_cong_monitor(struct rds_sock *rs, sockptr_t optval, int optlen)
357357
return ret;
358358
}
359359

360-
static int rds_set_transport(struct rds_sock *rs, sockptr_t optval, int optlen)
360+
static int rds_set_transport(struct net *net, struct rds_sock *rs,
361+
sockptr_t optval, int optlen)
361362
{
362363
int t_type;
363364

@@ -373,6 +374,10 @@ static int rds_set_transport(struct rds_sock *rs, sockptr_t optval, int optlen)
373374
if (t_type < 0 || t_type >= RDS_TRANS_COUNT)
374375
return -EINVAL;
375376

377+
/* RDS/IB is restricted to the initial network namespace */
378+
if (t_type != RDS_TRANS_TCP && !net_eq(net, &init_net))
379+
return -EPROTOTYPE;
380+
376381
rs->rs_transport = rds_trans_get(t_type);
377382

378383
return rs->rs_transport ? 0 : -ENOPROTOOPT;
@@ -433,6 +438,7 @@ static int rds_setsockopt(struct socket *sock, int level, int optname,
433438
sockptr_t optval, unsigned int optlen)
434439
{
435440
struct rds_sock *rs = rds_sk_to_rs(sock->sk);
441+
struct net *net = sock_net(sock->sk);
436442
int ret;
437443

438444
if (level != SOL_RDS) {
@@ -461,7 +467,7 @@ static int rds_setsockopt(struct socket *sock, int level, int optname,
461467
break;
462468
case SO_RDS_TRANSPORT:
463469
lock_sock(sock->sk);
464-
ret = rds_set_transport(rs, optval, optlen);
470+
ret = rds_set_transport(net, rs, optval, optlen);
465471
release_sock(sock->sk);
466472
break;
467473
case SO_TIMESTAMP_OLD:

net/rds/ib.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -494,6 +494,10 @@ static int rds_ib_laddr_check(struct net *net, const struct in6_addr *addr,
494494
{
495495
struct rds_ib_device *rds_ibdev = NULL;
496496

497+
/* RDS/IB is restricted to the initial network namespace */
498+
if (!net_eq(net, &init_net))
499+
return -EPROTOTYPE;
500+
497501
if (ipv6_addr_v4mapped(addr)) {
498502
rds_ibdev = rds_ib_get_device(addr->s6_addr32[3]);
499503
if (rds_ibdev) {

0 commit comments

Comments
 (0)