]> Cypherpunks repositories - gostls13.git/commitdiff
net: only enable broadcast on sockets which support it
authorSteven Hartland <steven.hartland@multiplay.co.uk>
Fri, 8 May 2020 14:17:55 +0000 (14:17 +0000)
committerIan Lance Taylor <iant@golang.org>
Sat, 9 May 2020 00:33:27 +0000 (00:33 +0000)
Only enable broadcast on SOCK_DGRAM and SOCK_RAW sockets, SOCK_STREAM
and others don't support it.

Don't enable SO_BROADCAST on UNIX domain sockets as they don't support it.

This caused failures on WSL which strictly checks setsockopt calls
unlike other OSes which often silently ignore bad options.

Also return error for setsockopt call for SO_BROADCAST on Windows
matching all other platforms but for IPv4 only as it's not supported
on IPv6 as per:
https://docs.microsoft.com/en-us/windows/win32/winsock/socket-options

Fixes #38954

Change-Id: I0503fd1ce96102b17121af548b66b3e9c2bb80d3
Reviewed-on: https://go-review.googlesource.com/c/go/+/232807
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/net/sockopt_aix.go
src/net/sockopt_bsd.go
src/net/sockopt_linux.go
src/net/sockopt_solaris.go
src/net/sockopt_windows.go

index b49c4d5c7c72087156bba82a0038e55d8c8e3ad8..7729a4470b6d4f1311f543752f99c1692bf1913f 100644 (file)
@@ -16,8 +16,11 @@ func setDefaultSockopts(s, family, sotype int, ipv6only bool) error {
                // never admit this option.
                syscall.SetsockoptInt(s, syscall.IPPROTO_IPV6, syscall.IPV6_V6ONLY, boolint(ipv6only))
        }
-       // Allow broadcast.
-       return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_BROADCAST, 1))
+       if (sotype == syscall.SOCK_DGRAM || sotype == syscall.SOCK_RAW) && family != syscall.AF_UNIX {
+               // Allow broadcast.
+               return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_BROADCAST, 1))
+       }
+       return nil
 }
 
 func setDefaultListenerSockopts(s int) error {
index 4ecc8cb1cf97b67001b7feb9299efe7b1bb0013f..8fd1e882c62d9e7971d367b6b493c0f400155f88 100644 (file)
@@ -31,8 +31,11 @@ func setDefaultSockopts(s, family, sotype int, ipv6only bool) error {
                // never admit this option.
                syscall.SetsockoptInt(s, syscall.IPPROTO_IPV6, syscall.IPV6_V6ONLY, boolint(ipv6only))
        }
-       // Allow broadcast.
-       return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_BROADCAST, 1))
+       if (sotype == syscall.SOCK_DGRAM || sotype == syscall.SOCK_RAW) && family != syscall.AF_UNIX {
+               // Allow broadcast.
+               return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_BROADCAST, 1))
+       }
+       return nil
 }
 
 func setDefaultListenerSockopts(s int) error {
index 0f70b12407bcade0925f18e3695914459d884199..3d544299acf8c133229a1e7b770c4b8d1b4f9fde 100644 (file)
@@ -16,8 +16,11 @@ func setDefaultSockopts(s, family, sotype int, ipv6only bool) error {
                // never admit this option.
                syscall.SetsockoptInt(s, syscall.IPPROTO_IPV6, syscall.IPV6_V6ONLY, boolint(ipv6only))
        }
-       // Allow broadcast.
-       return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_BROADCAST, 1))
+       if (sotype == syscall.SOCK_DGRAM || sotype == syscall.SOCK_RAW) && family != syscall.AF_UNIX {
+               // Allow broadcast.
+               return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_BROADCAST, 1))
+       }
+       return nil
 }
 
 func setDefaultListenerSockopts(s int) error {
index 0f70b12407bcade0925f18e3695914459d884199..3d544299acf8c133229a1e7b770c4b8d1b4f9fde 100644 (file)
@@ -16,8 +16,11 @@ func setDefaultSockopts(s, family, sotype int, ipv6only bool) error {
                // never admit this option.
                syscall.SetsockoptInt(s, syscall.IPPROTO_IPV6, syscall.IPV6_V6ONLY, boolint(ipv6only))
        }
-       // Allow broadcast.
-       return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_BROADCAST, 1))
+       if (sotype == syscall.SOCK_DGRAM || sotype == syscall.SOCK_RAW) && family != syscall.AF_UNIX {
+               // Allow broadcast.
+               return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_BROADCAST, 1))
+       }
+       return nil
 }
 
 func setDefaultListenerSockopts(s int) error {
index 80174265212daae6606e35fa55e1c7d69183c21b..8afaf34514d89211ea1303f3541ffddf3a62df42 100644 (file)
@@ -16,8 +16,10 @@ func setDefaultSockopts(s syscall.Handle, family, sotype int, ipv6only bool) err
                // never admit this option.
                syscall.SetsockoptInt(s, syscall.IPPROTO_IPV6, syscall.IPV6_V6ONLY, boolint(ipv6only))
        }
-       // Allow broadcast.
-       syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_BROADCAST, 1)
+       if (sotype == syscall.SOCK_DGRAM || sotype == syscall.SOCK_RAW) && family != syscall.AF_UNIX && family != syscall.AF_INET6 {
+               // Allow broadcast.
+               return os.NewSyscallError("setsockopt", syscall.SetsockoptInt(s, syscall.SOL_SOCKET, syscall.SO_BROADCAST, 1))
+       }
        return nil
 }