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


Reply via email to