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:
parent
b575a98121
commit
d380a97750
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user