1
0
mirror of https://github.com/golang/go synced 2024-10-04 10:31:22 -06:00

net: fix file descriptor leak on FileListener, FileConn and FilePacketConn

R=golang-dev, dave, r
CC=golang-dev
https://golang.org/cl/6430062
This commit is contained in:
Mikio Hara 2012-07-22 01:48:15 +09:00
parent b575a98121
commit d380a97750

View File

@ -17,8 +17,9 @@ func newFileFD(f *os.File) (*netFD, error) {
return nil, os.NewSyscallError("dup", err) return nil, os.NewSyscallError("dup", err)
} }
proto, err := syscall.GetsockoptInt(fd, syscall.SOL_SOCKET, syscall.SO_TYPE) sotype, err := syscall.GetsockoptInt(fd, syscall.SOL_SOCKET, syscall.SO_TYPE)
if err != nil { if err != nil {
closesocket(fd)
return nil, os.NewSyscallError("getsockopt", err) return nil, os.NewSyscallError("getsockopt", err)
} }
@ -31,24 +32,24 @@ func newFileFD(f *os.File) (*netFD, error) {
return nil, syscall.EINVAL return nil, syscall.EINVAL
case *syscall.SockaddrInet4: case *syscall.SockaddrInet4:
family = syscall.AF_INET family = syscall.AF_INET
if proto == syscall.SOCK_DGRAM { if sotype == syscall.SOCK_DGRAM {
toAddr = sockaddrToUDP toAddr = sockaddrToUDP
} else if proto == syscall.SOCK_RAW { } else if sotype == syscall.SOCK_RAW {
toAddr = sockaddrToIP toAddr = sockaddrToIP
} }
case *syscall.SockaddrInet6: case *syscall.SockaddrInet6:
family = syscall.AF_INET6 family = syscall.AF_INET6
if proto == syscall.SOCK_DGRAM { if sotype == syscall.SOCK_DGRAM {
toAddr = sockaddrToUDP toAddr = sockaddrToUDP
} else if proto == syscall.SOCK_RAW { } else if sotype == syscall.SOCK_RAW {
toAddr = sockaddrToIP toAddr = sockaddrToIP
} }
case *syscall.SockaddrUnix: case *syscall.SockaddrUnix:
family = syscall.AF_UNIX family = syscall.AF_UNIX
toAddr = sockaddrToUnix toAddr = sockaddrToUnix
if proto == syscall.SOCK_DGRAM { if sotype == syscall.SOCK_DGRAM {
toAddr = sockaddrToUnixgram toAddr = sockaddrToUnixgram
} else if proto == syscall.SOCK_SEQPACKET { } else if sotype == syscall.SOCK_SEQPACKET {
toAddr = sockaddrToUnixpacket toAddr = sockaddrToUnixpacket
} }
} }
@ -56,8 +57,9 @@ func newFileFD(f *os.File) (*netFD, error) {
sa, _ = syscall.Getpeername(fd) sa, _ = syscall.Getpeername(fd)
raddr := toAddr(sa) raddr := toAddr(sa)
netfd, err := newFD(fd, family, proto, laddr.Network()) netfd, err := newFD(fd, family, sotype, laddr.Network())
if err != nil { if err != nil {
closesocket(fd)
return nil, err return nil, err
} }
netfd.setAddr(laddr, raddr) netfd.setAddr(laddr, raddr)