]> Cypherpunks repositories - gostls13.git/commitdiff
net: make protocol-specific WriteTo, WriteMsg methods return error instead of crash
authorMikio Hara <mikioh.mikioh@gmail.com>
Sun, 18 Aug 2013 10:19:36 +0000 (19:19 +0900)
committerMikio Hara <mikioh.mikioh@gmail.com>
Sun, 18 Aug 2013 10:19:36 +0000 (19:19 +0900)
R=golang-dev, dave, rsc, adg, bradfitz
CC=golang-dev
https://golang.org/cl/11809043

src/pkg/net/iprawsock_posix.go
src/pkg/net/protoconn_test.go
src/pkg/net/udpsock_plan9.go
src/pkg/net/udpsock_posix.go
src/pkg/net/unixsock_posix.go

index 8d41d20d6da9912c78bb2ef288ac79947e5a7038..1df661c37de92c1479457187f87db13fbba48ec0 100644 (file)
@@ -128,6 +128,9 @@ func (c *IPConn) WriteToIP(b []byte, addr *IPAddr) (int, error) {
        if !c.ok() {
                return 0, syscall.EINVAL
        }
+       if addr == nil {
+               return 0, &OpError{Op: "write", Net: c.fd.net, Addr: nil, Err: errMissingAddress}
+       }
        sa, err := addr.sockaddr(c.fd.family)
        if err != nil {
                return 0, &OpError{"write", c.fd.net, addr, err}
@@ -154,6 +157,9 @@ func (c *IPConn) WriteMsgIP(b, oob []byte, addr *IPAddr) (n, oobn int, err error
        if !c.ok() {
                return 0, 0, syscall.EINVAL
        }
+       if addr == nil {
+               return 0, 0, &OpError{Op: "write", Net: c.fd.net, Addr: nil, Err: errMissingAddress}
+       }
        sa, err := addr.sockaddr(c.fd.family)
        if err != nil {
                return 0, 0, &OpError{"write", c.fd.net, addr, err}
index 7e4fbdaa748217eac0410ec0035232ae052701d6..56f22da0712e1f21cffce0d2a59e81390377a077 100644 (file)
@@ -161,6 +161,15 @@ func TestUDPConnSpecificMethods(t *testing.T) {
        } else {
                f.Close()
        }
+
+       defer func() {
+               if p := recover(); p != nil {
+                       t.Fatalf("UDPConn.WriteToUDP or WriteMsgUDP panicked: %v", p)
+               }
+       }()
+
+       c.WriteToUDP(wb, nil)
+       c.WriteMsgUDP(wb, nil, nil)
 }
 
 func TestIPConnSpecificMethods(t *testing.T) {
@@ -218,6 +227,15 @@ func TestIPConnSpecificMethods(t *testing.T) {
        } else {
                f.Close()
        }
+
+       defer func() {
+               if p := recover(); p != nil {
+                       t.Fatalf("IPConn.WriteToIP or WriteMsgIP panicked: %v", p)
+               }
+       }()
+
+       c.WriteToIP(wb, nil)
+       c.WriteMsgIP(wb, nil, nil)
 }
 
 func TestUnixListenerSpecificMethods(t *testing.T) {
@@ -358,4 +376,15 @@ func TestUnixConnSpecificMethods(t *testing.T) {
        } else {
                f.Close()
        }
+
+       defer func() {
+               if p := recover(); p != nil {
+                       t.Fatalf("UnixConn.WriteToUnix or WriteMsgUnix panicked: %v", p)
+               }
+       }()
+
+       c1.WriteToUnix(wb, nil)
+       c1.WriteMsgUnix(wb, nil, nil)
+       c3.WriteToUnix(wb, nil)
+       c3.WriteMsgUnix(wb, nil, nil)
 }
index 12a348399057f0c5be27cd51048a11d1ae738f2d..73621706d5c814213c915700e9078ccfb8863cc8 100644 (file)
@@ -73,6 +73,9 @@ func (c *UDPConn) WriteToUDP(b []byte, addr *UDPAddr) (int, error) {
        if !c.ok() || c.fd.data == nil {
                return 0, syscall.EINVAL
        }
+       if addr == nil {
+               return 0, &OpError{Op: "write", Net: c.fd.dir, Addr: nil, Err: errMissingAddress}
+       }
        h := new(udpHeader)
        h.raddr = addr.IP.To16()
        h.laddr = c.fd.laddr.(*UDPAddr).IP.To16()
index 0504e4ff5bcfe9d20eb561353bcf4df7fdd3de0e..1eee64f0c8c485c6d35fa5784826572bf7ec552e 100644 (file)
@@ -124,6 +124,9 @@ func (c *UDPConn) WriteToUDP(b []byte, addr *UDPAddr) (int, error) {
        if c.fd.isConnected {
                return 0, &OpError{"write", c.fd.net, addr, ErrWriteToConnected}
        }
+       if addr == nil {
+               return 0, &OpError{Op: "write", Net: c.fd.net, Addr: nil, Err: errMissingAddress}
+       }
        sa, err := addr.sockaddr(c.fd.family)
        if err != nil {
                return 0, &OpError{"write", c.fd.net, addr, err}
@@ -153,6 +156,9 @@ func (c *UDPConn) WriteMsgUDP(b, oob []byte, addr *UDPAddr) (n, oobn int, err er
        if c.fd.isConnected {
                return 0, 0, &OpError{"write", c.fd.net, addr, ErrWriteToConnected}
        }
+       if addr == nil {
+               return 0, 0, &OpError{Op: "write", Net: c.fd.net, Addr: nil, Err: errMissingAddress}
+       }
        sa, err := addr.sockaddr(c.fd.family)
        if err != nil {
                return 0, 0, &OpError{"write", c.fd.net, addr, err}
index 593a43516e1476a2ac3fab5cf8e0d27f86eb2bda..2ae92a02338c164bacc88092b20ddcee73cb88a6 100644 (file)
@@ -186,6 +186,9 @@ func (c *UnixConn) WriteToUnix(b []byte, addr *UnixAddr) (n int, err error) {
        if !c.ok() {
                return 0, syscall.EINVAL
        }
+       if addr == nil {
+               return 0, &OpError{Op: "write", Net: c.fd.net, Addr: nil, Err: errMissingAddress}
+       }
        if addr.Net != sotypeToNet(c.fd.sotype) {
                return 0, syscall.EAFNOSUPPORT
        }