From: Joan Lledó <[email protected]>
There was a code path for when a control block is requested, but AFAIK there
was not path for when it's not requested.
That leaded to the control block being filled with garbage when not requested.
---
pfinet/linux-src/net/ipv4/ip_sockglue.c | 9 +++++++--
pfinet/linux-src/net/ipv4/raw.c | 3 +--
pfinet/linux-src/net/ipv4/udp.c | 3 +--
pfinet/linux-src/net/ipv6/datagram_ipv6.c | 3 +--
pfinet/linux-src/net/ipv6/udp_ipv6.c | 3 +--
5 files changed, 11 insertions(+), 10 deletions(-)
diff --git a/pfinet/linux-src/net/ipv4/ip_sockglue.c
b/pfinet/linux-src/net/ipv4/ip_sockglue.c
index 369a6770..5ae4b181 100644
--- a/pfinet/linux-src/net/ipv4/ip_sockglue.c
+++ b/pfinet/linux-src/net/ipv4/ip_sockglue.c
@@ -119,6 +119,12 @@ void ip_cmsg_recv(struct msghdr *msg, struct sk_buff *skb)
{
unsigned flags = skb->sk->ip_cmsg_flags;
+ if (flags == 0) {
+ msg->msg_control = NULL;
+ msg->msg_controllen = 0;
+ return;
+ }
+
/* Ordered by supposed usage frequency */
if (flags & 1)
ip_cmsg_recv_pktinfo(msg, skb);
@@ -340,8 +346,7 @@ int ip_recv_error(struct sock *sk, struct msghdr *msg, int
len)
if (serr->ee.ee_origin == SO_EE_ORIGIN_ICMP) {
sin->sin_family = AF_INET;
sin->sin_addr.s_addr = skb->nh.iph->saddr;
- if (sk->ip_cmsg_flags)
- ip_cmsg_recv(msg, skb);
+ ip_cmsg_recv(msg, skb);
}
put_cmsg(msg, SOL_IP, IP_RECVERR, sizeof(errhdr), &errhdr);
diff --git a/pfinet/linux-src/net/ipv4/raw.c b/pfinet/linux-src/net/ipv4/raw.c
index a0aaa82e..4198f0ac 100644
--- a/pfinet/linux-src/net/ipv4/raw.c
+++ b/pfinet/linux-src/net/ipv4/raw.c
@@ -467,8 +467,7 @@ int raw_recvmsg(struct sock *sk, struct msghdr *msg, int
len,
sin->sin_family = AF_INET;
sin->sin_addr.s_addr = skb->nh.iph->saddr;
}
- if (sk->ip_cmsg_flags)
- ip_cmsg_recv(msg, skb);
+ ip_cmsg_recv(msg, skb);
done:
skb_free_datagram(sk, skb);
return (err ? : copied);
diff --git a/pfinet/linux-src/net/ipv4/udp.c b/pfinet/linux-src/net/ipv4/udp.c
index c1da9886..f048aa3b 100644
--- a/pfinet/linux-src/net/ipv4/udp.c
+++ b/pfinet/linux-src/net/ipv4/udp.c
@@ -872,8 +872,7 @@ int udp_recvmsg(struct sock *sk, struct msghdr *msg, int
len,
}
#endif
}
- if (sk->ip_cmsg_flags)
- ip_cmsg_recv(msg, skb);
+ ip_cmsg_recv(msg, skb);
err = copied;
out_free:
diff --git a/pfinet/linux-src/net/ipv6/datagram_ipv6.c
b/pfinet/linux-src/net/ipv6/datagram_ipv6.c
index 1ed33de8..35502179 100644
--- a/pfinet/linux-src/net/ipv6/datagram_ipv6.c
+++ b/pfinet/linux-src/net/ipv6/datagram_ipv6.c
@@ -166,8 +166,7 @@ int ipv6_recv_error(struct sock *sk, struct msghdr *msg,
int len)
ipv6_addr_set(&sin->sin6_addr, 0, 0,
__constant_htonl(0xffff),
skb->nh.iph->saddr);
- if (sk->ip_cmsg_flags)
- ip_cmsg_recv(msg, skb);
+ ip_cmsg_recv(msg, skb);
}
}
diff --git a/pfinet/linux-src/net/ipv6/udp_ipv6.c
b/pfinet/linux-src/net/ipv6/udp_ipv6.c
index 6d4bbdb9..53c72a48 100644
--- a/pfinet/linux-src/net/ipv6/udp_ipv6.c
+++ b/pfinet/linux-src/net/ipv6/udp_ipv6.c
@@ -487,8 +487,7 @@ int udpv6_recvmsg(struct sock *sk, struct msghdr *msg, int
len,
if (skb->protocol == __constant_htons(ETH_P_IP)) {
ipv6_addr_set(&sin6->sin6_addr, 0, 0,
__constant_htonl(0xffff),
skb->nh.iph->saddr);
- if (sk->ip_cmsg_flags)
- ip_cmsg_recv(msg, skb);
+ ip_cmsg_recv(msg, skb);
} else {
memcpy(&sin6->sin6_addr, &skb->nh.ipv6h->saddr,
sizeof(struct in6_addr));
--
2.50.1