On 01/02/17(Wed) 19:27, David Hill wrote:
> Hello -
> 
> This diff makes sosetopt responsible for m_free which is much simpler.
> Requested by bluhm@ 

I'd suggest to move the m_free(9) calls to sys_setsockopt().  This
simplifies the existing code even more and will make it easier to use
the stack for this temporary storage.

> 
> 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;
>       }
>  }
> 

Reply via email to