Skip to content

Commit 8cf4f8c

Browse files
committed
Merge tag 'rxrpc-next-20221116' of git://git.kernel.org/pub/scm/linux/kernel/git/dhowells/linux-fs
David Howells says: ==================== rxrpc: Fix oops and missing config conditionals The patches that were pulled into net-next previously[1] had some issues that this patchset fixes: (1) Fix missing IPV6 config conditionals. (2) Fix an oops caused by calling udpv6_sendmsg() directly on an AF_INET socket. (3) Fix the validation of network addresses on entry to socket functions so that we don't allow an AF_INET6 address if we've selected an AF_INET transport socket. Link: https://lore.kernel.org/r/166794587113.2389296.16484814996876530222.stgit@warthog.procyon.org.uk/ [1] ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents fd896e3 + 66f6fd2 commit 8cf4f8c

File tree

3 files changed

+19
-11
lines changed

3 files changed

+19
-11
lines changed

net/rxrpc/af_rxrpc.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,19 +93,20 @@ static int rxrpc_validate_address(struct rxrpc_sock *rx,
9393
srx->transport_len > len)
9494
return -EINVAL;
9595

96-
if (srx->transport.family != rx->family &&
97-
srx->transport.family == AF_INET && rx->family != AF_INET6)
98-
return -EAFNOSUPPORT;
99-
10096
switch (srx->transport.family) {
10197
case AF_INET:
98+
if (rx->family != AF_INET &&
99+
rx->family != AF_INET6)
100+
return -EAFNOSUPPORT;
102101
if (srx->transport_len < sizeof(struct sockaddr_in))
103102
return -EINVAL;
104103
tail = offsetof(struct sockaddr_rxrpc, transport.sin.__pad);
105104
break;
106105

107106
#ifdef CONFIG_AF_RXRPC_IPV6
108107
case AF_INET6:
108+
if (rx->family != AF_INET6)
109+
return -EAFNOSUPPORT;
109110
if (srx->transport_len < sizeof(struct sockaddr_in6))
110111
return -EINVAL;
111112
tail = offsetof(struct sockaddr_rxrpc, transport) +

net/rxrpc/local_object.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ static void rxrpc_encap_err_rcv(struct sock *sk, struct sk_buff *skb, int err,
3333
{
3434
if (ip_hdr(skb)->version == IPVERSION)
3535
return ip_icmp_error(sk, skb, err, port, info, payload);
36-
return ipv6_icmp_error(sk, skb, err, port, info, payload);
36+
if (IS_ENABLED(CONFIG_AF_RXRPC_IPV6))
37+
return ipv6_icmp_error(sk, skb, err, port, info, payload);
3738
}
3839

3940
/*

net/rxrpc/output.c

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,21 @@
1818

1919
extern int udpv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len);
2020

21-
static ssize_t do_udp_sendmsg(struct socket *sk, struct msghdr *msg, size_t len)
21+
static ssize_t do_udp_sendmsg(struct socket *socket, struct msghdr *msg, size_t len)
2222
{
23-
#if IS_ENABLED(CONFIG_AF_RXRPC_IPV6)
2423
struct sockaddr *sa = msg->msg_name;
24+
struct sock *sk = socket->sk;
2525

26-
if (sa->sa_family == AF_INET6)
27-
return udpv6_sendmsg(sk->sk, msg, len);
28-
#endif
29-
return udp_sendmsg(sk->sk, msg, len);
26+
if (IS_ENABLED(CONFIG_AF_RXRPC_IPV6)) {
27+
if (sa->sa_family == AF_INET6) {
28+
if (sk->sk_family != AF_INET6) {
29+
pr_warn("AF_INET6 address on AF_INET socket\n");
30+
return -ENOPROTOOPT;
31+
}
32+
return udpv6_sendmsg(sk, msg, len);
33+
}
34+
}
35+
return udp_sendmsg(sk, msg, len);
3036
}
3137

3238
struct rxrpc_abort_buffer {

0 commit comments

Comments
 (0)