Skip to content

Commit b4ace4f

Browse files
kraigatgoogdavem330
authored andcommitted
soreuseport: fix NULL ptr dereference SO_REUSEPORT after bind
Marc Dionne discovered a NULL pointer dereference when setting SO_REUSEPORT on a socket after it is bound. This patch removes the assumption that at least one socket in the reuseport group is bound with the SO_REUSEPORT option before other bind calls occur. Fixes: e32ea7e ("soreuseport: fast reuseport UDP socket selection") Reported-by: Marc Dionne <marc.c.dionne@gmail.com> Signed-off-by: Craig Gallek <kraig@google.com> Tested-by: Marc Dionne <marc.dionne@auristor.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 52a82e2 commit b4ace4f

File tree

2 files changed

+9
-2
lines changed

2 files changed

+9
-2
lines changed

include/net/sock_reuseport.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ struct sock_reuseport {
1616
};
1717

1818
extern int reuseport_alloc(struct sock *sk);
19-
extern int reuseport_add_sock(struct sock *sk, const struct sock *sk2);
19+
extern int reuseport_add_sock(struct sock *sk, struct sock *sk2);
2020
extern void reuseport_detach_sock(struct sock *sk);
2121
extern struct sock *reuseport_select_sock(struct sock *sk,
2222
u32 hash,

net/core/sock_reuseport.c

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,10 +93,17 @@ static struct sock_reuseport *reuseport_grow(struct sock_reuseport *reuse)
9393
* @sk2: Socket belonging to the existing reuseport group.
9494
* May return ENOMEM and not add socket to group under memory pressure.
9595
*/
96-
int reuseport_add_sock(struct sock *sk, const struct sock *sk2)
96+
int reuseport_add_sock(struct sock *sk, struct sock *sk2)
9797
{
9898
struct sock_reuseport *reuse;
9999

100+
if (!rcu_access_pointer(sk2->sk_reuseport_cb)) {
101+
int err = reuseport_alloc(sk2);
102+
103+
if (err)
104+
return err;
105+
}
106+
100107
spin_lock_bh(&reuseport_lock);
101108
reuse = rcu_dereference_protected(sk2->sk_reuseport_cb,
102109
lockdep_is_held(&reuseport_lock)),

0 commit comments

Comments
 (0)