Author: markj
Date: Tue Oct 15 14:18:01 2019
New Revision: 353552
URL: https://svnweb.freebsd.org/changeset/base/353552

Log:
  MFC r353295:
  Improve locking in the IPV6_V6ONLY socket option handler.

Modified:
  stable/12/sys/netinet6/ip6_output.c
Directory Properties:
  stable/12/   (props changed)

Modified: stable/12/sys/netinet6/ip6_output.c
==============================================================================
--- stable/12/sys/netinet6/ip6_output.c Tue Oct 15 14:13:01 2019        
(r353551)
+++ stable/12/sys/netinet6/ip6_output.c Tue Oct 15 14:18:01 2019        
(r353552)
@@ -1717,21 +1717,24 @@ do {                                                    
                \
 #endif
 
                                case IPV6_V6ONLY:
-                                       /*
-                                        * make setsockopt(IPV6_V6ONLY)
-                                        * available only prior to bind(2).
-                                        * see ipng mailing list, Jun 22 2001.
-                                        */
+                                       INP_WLOCK(inp);
                                        if (in6p->inp_lport ||
                                            
!IN6_IS_ADDR_UNSPECIFIED(&in6p->in6p_laddr)) {
+                                               /*
+                                                * The socket is already bound.
+                                                */
+                                               INP_WUNLOCK(inp);
                                                error = EINVAL;
                                                break;
                                        }
-                                       OPTSET(IN6P_IPV6_V6ONLY);
-                                       if (optval)
+                                       if (optval) {
+                                               inp->inp_flags |= 
IN6P_IPV6_V6ONLY;
                                                in6p->inp_vflag &= ~INP_IPV4;
-                                       else
+                                       } else {
+                                               inp->inp_flags &= 
~IN6P_IPV6_V6ONLY;
                                                in6p->inp_vflag |= INP_IPV4;
+                                       }
+                                       INP_WUNLOCK(inp);
                                        break;
                                case IPV6_RECVTCLASS:
                                        /* cannot mix with RFC2292 XXX */
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to