From c33a23133737ee1af448ca8f39263faffe41a522 Mon Sep 17 00:00:00 2001 From: "Andrey V. Elsukov" Date: Fri, 14 Apr 2017 09:00:48 +0000 Subject: [PATCH] Rework r316770 to make it protocol independent and general, like we do for streaming sockets. And do more cleanup in the sbappendaddr_locked_internal() to prevent leak information from existing mbuf to the one, that will be possible created later by netgraph. Suggested by: glebius Tested by: Irina Liakh MFC after: 1 week --- sys/kern/uipc_sockbuf.c | 14 +++++++++++++- sys/netinet/udp_usrreq.c | 3 --- sys/netinet6/udp6_usrreq.c | 3 --- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/sys/kern/uipc_sockbuf.c b/sys/kern/uipc_sockbuf.c index f8e3779b698..670b8fcae96 100644 --- a/sys/kern/uipc_sockbuf.c +++ b/sys/kern/uipc_sockbuf.c @@ -794,8 +794,20 @@ sbappendaddr_locked_internal(struct sockbuf *sb, const struct sockaddr *asa, return (0); m->m_len = asa->sa_len; bcopy(asa, mtod(m, caddr_t), asa->sa_len); - if (m0) + if (m0) { m_clrprotoflags(m0); + m_tag_delete_chain(m0); + /* + * Clear some persistent info from pkthdr. + * We don't use m_demote(), because some netgraph consumers + * expect M_PKTHDR presence. + */ + m0->m_pkthdr.rcvif = NULL; + m0->m_pkthdr.flowid = 0; + m0->m_pkthdr.csum_flags = 0; + m0->m_pkthdr.fibnum = 0; + m0->m_pkthdr.rsstype = 0; + } if (ctrl_last) ctrl_last->m_next = m0; /* concatenate data to control */ else diff --git a/sys/netinet/udp_usrreq.c b/sys/netinet/udp_usrreq.c index abad94d98c7..f7507dc1381 100644 --- a/sys/netinet/udp_usrreq.c +++ b/sys/netinet/udp_usrreq.c @@ -372,9 +372,6 @@ udp_append(struct inpcb *inp, struct ip *ip, struct mbuf *n, int off, append_sa = (struct sockaddr *)&udp_in[0]; m_adj(n, off); - /* Clear any h/w csum flags as they are no longer valid. */ - n->m_pkthdr.csum_flags &= ~(CSUM_DATA_VALID | CSUM_IP_VALID); - so = inp->inp_socket; SOCKBUF_LOCK(&so->so_rcv); if (sbappendaddr_locked(&so->so_rcv, append_sa, n, opts) == 0) { diff --git a/sys/netinet6/udp6_usrreq.c b/sys/netinet6/udp6_usrreq.c index 2572ede205c..15d0f010254 100644 --- a/sys/netinet6/udp6_usrreq.c +++ b/sys/netinet6/udp6_usrreq.c @@ -187,9 +187,6 @@ udp6_append(struct inpcb *inp, struct mbuf *n, int off, } m_adj(n, off + sizeof(struct udphdr)); - /* Clear any h/w csum flags as they are no longer valid. */ - n->m_pkthdr.csum_flags &= ~CSUM_DATA_VALID; - so = inp->inp_socket; SOCKBUF_LOCK(&so->so_rcv); if (sbappendaddr_locked(&so->so_rcv, (struct sockaddr *)&fromsa[0], n,