On 02/02/17(Thu) 12:12, David Hill wrote:
> On Thu, Feb 02, 2017 at 09:34:07AM +0100, Martin Pieuchot wrote:
> > 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.
> > 
> 
> New diff with mpi@'s suggestion. 

You forgot NFS and BFD that should now call m_free(9) after sosetopt(9). 

> 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 16:59:45 -0000
> @@ -1551,16 +1551,15 @@ sowwakeup(struct socket *so)
>  }
>  
>  int
> -sosetopt(struct socket *so, int level, int optname, struct mbuf *m0)
> +sosetopt(struct socket *so, int level, int optname, struct mbuf *m)
>  {
>       int s, error = 0;
> -     struct mbuf *m = m0;
>  
>       if (level != SOL_SOCKET) {
>               if (so->so_proto && so->so_proto->pr_ctloutput) {
>                       NET_LOCK(s);
>                       error = (*so->so_proto->pr_ctloutput)(PRCO_SETOPT, so,
> -                         level, optname, m0);
> +                         level, optname, m);
>                       NET_UNLOCK(s);
>                       return (error);
>               }
> @@ -1707,7 +1706,7 @@ sosetopt(struct socket *so, int level, i
>                               level = dom->dom_protosw->pr_protocol;
>                               NET_LOCK(s);
>                               error = (*so->so_proto->pr_ctloutput)
> -                                 (PRCO_SETOPT, so, level, optname, m0);
> +                                 (PRCO_SETOPT, so, level, optname, m);
>                               NET_UNLOCK(s);
>                               return (error);
>                       }
> @@ -1739,14 +1738,11 @@ sosetopt(struct socket *so, int level, i
>               if (error == 0 && so->so_proto && so->so_proto->pr_ctloutput) {
>                       NET_LOCK(s);
>                       (*so->so_proto->pr_ctloutput)(PRCO_SETOPT, so,
> -                         level, optname, m0);
> +                         level, optname, m);
>                       NET_UNLOCK(s);
> -                     m = NULL;       /* freed by protocol */
>               }
>       }
>  bad:
> -     if (m)
> -             (void) m_free(m);
>       return (error);
>  }
>  
> Index: kern/uipc_syscalls.c
> ===================================================================
> RCS file: /cvs/src/sys/kern/uipc_syscalls.c,v
> retrieving revision 1.148
> diff -u -p -r1.148 uipc_syscalls.c
> --- kern/uipc_syscalls.c      26 Jan 2017 01:58:00 -0000      1.148
> +++ kern/uipc_syscalls.c      2 Feb 2017 16:59:45 -0000
> @@ -962,19 +962,13 @@ sys_setsockopt(struct proc *p, void *v, 
>                               goto bad;
>                       }
>               }
> -             if (m == NULL) {
> -                     error = ENOBUFS;
> -                     goto bad;
> -             }
>               error = copyin(SCARG(uap, val), mtod(m, caddr_t),
>                   SCARG(uap, valsize));
> -             if (error) {
> +             if (error)
>                       goto bad;
> -             }
>               m->m_len = SCARG(uap, valsize);
>       }
>       error = sosetopt(fp->f_data, SCARG(uap, level), SCARG(uap, name), m);
> -     m = NULL;
>  bad:
>       m_freem(m);
>       FRELE(fp, p);
> 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 16:59:45 -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 16:59:46 -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 16:59:46 -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 16:59:46 -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 16:59:46 -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 16:59:46 -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 16:59:46 -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 16:59:46 -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