Hello -
This diff makes sosetopt responsible for m_free which is much simpler.
Requested by bluhm@
Index: kern/uipc_socket.c
===================================================================
RCS file: /cvs/src/sys/kern/uipc_socket.c,v
retrieving revision 1.176
diff -u -p -r1.176 uipc_socket.c
--- kern/uipc_socket.c 1 Feb 2017 20:59:47 -0000 1.176
+++ kern/uipc_socket.c 2 Feb 2017 00:13:23 -0000
@@ -1562,6 +1562,7 @@ sosetopt(struct socket *so, int level, i
error = (*so->so_proto->pr_ctloutput)(PRCO_SETOPT, so,
level, optname, m0);
NET_UNLOCK(s);
+ m_free(m0);
return (error);
}
error = ENOPROTOOPT;
@@ -1709,6 +1710,7 @@ sosetopt(struct socket *so, int level, i
error = (*so->so_proto->pr_ctloutput)
(PRCO_SETOPT, so, level, optname, m0);
NET_UNLOCK(s);
+ m_free(m0);
return (error);
}
error = ENOPROTOOPT;
@@ -1741,7 +1743,8 @@ sosetopt(struct socket *so, int level, i
(*so->so_proto->pr_ctloutput)(PRCO_SETOPT, so,
level, optname, m0);
NET_UNLOCK(s);
- m = NULL; /* freed by protocol */
+ m_free(m0);
+ m = NULL;
}
}
bad:
Index: net/rtsock.c
===================================================================
RCS file: /cvs/src/sys/net/rtsock.c,v
retrieving revision 1.222
diff -u -p -r1.222 rtsock.c
--- net/rtsock.c 1 Feb 2017 20:59:47 -0000 1.222
+++ net/rtsock.c 2 Feb 2017 00:13:23 -0000
@@ -240,12 +240,8 @@ route_ctloutput(int op, struct socket *s
int error = 0;
unsigned int tid;
- if (level != AF_ROUTE) {
- error = EINVAL;
- if (op == PRCO_SETOPT && m)
- m_free(m);
- return (error);
- }
+ if (level != AF_ROUTE)
+ return EINVAL;
switch (op) {
case PRCO_SETOPT:
@@ -271,7 +267,6 @@ route_ctloutput(int op, struct socket *s
error = ENOPROTOOPT;
break;
}
- m_free(m);
break;
case PRCO_GETOPT:
switch (optname) {
Index: netinet/ip_mroute.c
===================================================================
RCS file: /cvs/src/sys/netinet/ip_mroute.c,v
retrieving revision 1.108
diff -u -p -r1.108 ip_mroute.c
--- netinet/ip_mroute.c 1 Feb 2017 20:59:47 -0000 1.108
+++ netinet/ip_mroute.c 2 Feb 2017 00:13:23 -0000
@@ -209,7 +209,6 @@ ip_mrouter_set(struct socket *so, int op
break;
}
- m_free(m);
return (error);
}
Index: netinet/ip_output.c
===================================================================
RCS file: /cvs/src/sys/netinet/ip_output.c,v
retrieving revision 1.335
diff -u -p -r1.335 ip_output.c
--- netinet/ip_output.c 1 Feb 2017 20:59:47 -0000 1.335
+++ netinet/ip_output.c 2 Feb 2017 00:13:23 -0000
@@ -853,11 +853,10 @@ ip_ctloutput(int op, struct socket *so,
int error = 0;
u_int rtid = 0;
- if (level != IPPROTO_IP) {
- error = EINVAL;
- if (op == PRCO_SETOPT)
- (void) m_free(m);
- } else switch (op) {
+ if (level != IPPROTO_IP)
+ return EINVAL;
+
+ switch (op) {
case PRCO_SETOPT:
switch (optname) {
case IP_OPTIONS:
@@ -1073,7 +1072,6 @@ ip_ctloutput(int op, struct socket *so,
error = ENOPROTOOPT;
break;
}
- m_free(m);
break;
case PRCO_GETOPT:
@@ -1235,12 +1233,11 @@ ip_pcbopts(struct mbuf **pcbopt, struct
/* turn off any old options */
m_free(*pcbopt);
- *pcbopt = 0;
+ *pcbopt = NULL;
if (m == NULL || m->m_len == 0) {
/*
* Only turning off any previous options.
*/
- m_free(m);
return (0);
}
@@ -1316,7 +1313,6 @@ ip_pcbopts(struct mbuf **pcbopt, struct
return (0);
bad:
- (void)m_free(m);
return (EINVAL);
}
Index: netinet/raw_ip.c
===================================================================
RCS file: /cvs/src/sys/netinet/raw_ip.c,v
retrieving revision 1.95
diff -u -p -r1.95 raw_ip.c
--- netinet/raw_ip.c 1 Feb 2017 20:59:47 -0000 1.95
+++ netinet/raw_ip.c 2 Feb 2017 00:13:23 -0000
@@ -305,11 +305,8 @@ rip_ctloutput(int op, struct socket *so,
int error = 0;
int dir;
- if (level != IPPROTO_IP) {
- if (op == PRCO_SETOPT)
- (void) m_free(m);
- return (EINVAL);
- }
+ if (level != IPPROTO_IP)
+ return EINVAL;
switch (optname) {
@@ -322,7 +319,6 @@ rip_ctloutput(int op, struct socket *so,
inp->inp_flags |= INP_HDRINCL;
else
inp->inp_flags &= ~INP_HDRINCL;
- m_free(m);
} else {
m->m_len = sizeof(int);
*mtod(m, int *) = inp->inp_flags & INP_HDRINCL;
@@ -344,7 +340,6 @@ rip_ctloutput(int op, struct socket *so,
inp->inp_divertfl = dir;
else
error = EINVAL;
-
break;
case PRCO_GETOPT:
@@ -357,8 +352,6 @@ rip_ctloutput(int op, struct socket *so,
break;
}
- if (op == PRCO_SETOPT)
- (void)m_free(m);
return (error);
case MRT_INIT:
@@ -385,8 +378,6 @@ rip_ctloutput(int op, struct socket *so,
}
return (error);
#else
- if (op == PRCO_SETOPT)
- m_free(m);
return (EOPNOTSUPP);
#endif
}
Index: netinet/tcp_usrreq.c
===================================================================
RCS file: /cvs/src/sys/netinet/tcp_usrreq.c,v
retrieving revision 1.143
diff -u -p -r1.143 tcp_usrreq.c
--- netinet/tcp_usrreq.c 1 Feb 2017 20:59:47 -0000 1.143
+++ netinet/tcp_usrreq.c 2 Feb 2017 00:13:23 -0000
@@ -457,11 +457,9 @@ tcp_ctloutput(int op, struct socket *so,
int i;
inp = sotoinpcb(so);
- if (inp == NULL) {
- if (op == PRCO_SETOPT)
- (void) m_free(m);
- return (ECONNRESET);
- }
+ if (inp == NULL)
+ return ECONNRESET;
+
if (level != IPPROTO_TCP) {
switch (so->so_proto->pr_domain->dom_family) {
#ifdef INET6
@@ -481,10 +479,8 @@ tcp_ctloutput(int op, struct socket *so,
tp = intotcpcb(inp);
switch (op) {
-
case PRCO_SETOPT:
switch (optname) {
-
case TCP_NODELAY:
if (m == NULL || m->m_len < sizeof (int))
error = EINVAL;
@@ -567,7 +563,6 @@ tcp_ctloutput(int op, struct socket *so,
error = ENOPROTOOPT;
break;
}
- m_free(m);
break;
case PRCO_GETOPT:
Index: netinet6/icmp6.c
===================================================================
RCS file: /cvs/src/sys/netinet6/icmp6.c,v
retrieving revision 1.198
diff -u -p -r1.198 icmp6.c
--- netinet6/icmp6.c 1 Feb 2017 20:59:47 -0000 1.198
+++ netinet6/icmp6.c 2 Feb 2017 00:13:23 -0000
@@ -1807,11 +1807,8 @@ icmp6_ctloutput(int op, struct socket *s
int error = 0;
struct inpcb *in6p = sotoinpcb(so);
- if (level != IPPROTO_ICMPV6) {
- if (op == PRCO_SETOPT)
- (void)m_free(m);
+ if (level != IPPROTO_ICMPV6)
return EINVAL;
- }
switch (op) {
case PRCO_SETOPT:
@@ -1839,7 +1836,6 @@ icmp6_ctloutput(int op, struct socket *s
error = ENOPROTOOPT;
break;
}
- m_freem(m);
break;
case PRCO_GETOPT:
Index: netinet6/ip6_output.c
===================================================================
RCS file: /cvs/src/sys/netinet6/ip6_output.c,v
retrieving revision 1.223
diff -u -p -r1.223 ip6_output.c
--- netinet6/ip6_output.c 1 Feb 2017 20:59:47 -0000 1.223
+++ netinet6/ip6_output.c 2 Feb 2017 00:13:23 -0000
@@ -1390,7 +1390,6 @@ do { \
error = ENOPROTOOPT;
break;
}
- m_free(m);
break;
case PRCO_GETOPT:
@@ -1591,11 +1590,8 @@ do { \
}
break;
}
- } else {
+ } else
error = EINVAL;
- if (op == PRCO_SETOPT)
- (void)m_free(m);
- }
return (error);
}
@@ -1607,11 +1603,8 @@ ip6_raw_ctloutput(int op, struct socket
const int icmp6off = offsetof(struct icmp6_hdr, icmp6_cksum);
struct inpcb *inp = sotoinpcb(so);
- if (level != IPPROTO_IPV6) {
- if (op == PRCO_SETOPT)
- (void)m_free(m);
+ if (level != IPPROTO_IPV6)
return (EINVAL);
- }
switch (optname) {
case IPV6_CHECKSUM:
@@ -1660,9 +1653,6 @@ ip6_raw_ctloutput(int op, struct socket
error = ENOPROTOOPT;
break;
}
-
- if (op == PRCO_SETOPT)
- (void)m_free(m);
return (error);
}
Index: netinet6/raw_ip6.c
===================================================================
RCS file: /cvs/src/sys/netinet6/raw_ip6.c,v
retrieving revision 1.104
diff -u -p -r1.104 raw_ip6.c
--- netinet6/raw_ip6.c 1 Feb 2017 20:59:47 -0000 1.104
+++ netinet6/raw_ip6.c 2 Feb 2017 00:13:23 -0000
@@ -511,8 +511,6 @@ rip6_ctloutput(int op, struct socket *so
break;
}
- if (op == PRCO_SETOPT)
- (void)m_free(m);
return (error);
#ifdef MROUTING
@@ -522,10 +520,9 @@ rip6_ctloutput(int op, struct socket *so
case MRT6_DEL_MIF:
case MRT6_ADD_MFC:
case MRT6_DEL_MFC:
- if (op == PRCO_SETOPT) {
+ if (op == PRCO_SETOPT)
error = ip6_mrouter_set(optname, so, m);
- m_free(m);
- } else if (op == PRCO_GETOPT)
+ else if (op == PRCO_GETOPT)
error = ip6_mrouter_get(optname, so, m);
else
error = EINVAL;
@@ -545,8 +542,6 @@ rip6_ctloutput(int op, struct socket *so
return (icmp6_ctloutput(op, so, level, optname, m));
default:
- if (op == PRCO_SETOPT)
- m_free(m);
return EINVAL;
}
}