|
@@ -65,22 +65,24 @@ func ListenPacket(network, address string) (*PacketConn, error) {
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
return nil, os.NewSyscallError("socket", err)
|
|
return nil, os.NewSyscallError("socket", err)
|
|
|
}
|
|
}
|
|
|
- defer syscall.Close(s)
|
|
|
|
|
if runtime.GOOS == "darwin" && family == syscall.AF_INET {
|
|
if runtime.GOOS == "darwin" && family == syscall.AF_INET {
|
|
|
if err := syscall.SetsockoptInt(s, iana.ProtocolIP, sysIP_STRIPHDR, 1); err != nil {
|
|
if err := syscall.SetsockoptInt(s, iana.ProtocolIP, sysIP_STRIPHDR, 1); err != nil {
|
|
|
|
|
+ syscall.Close(s)
|
|
|
return nil, os.NewSyscallError("setsockopt", err)
|
|
return nil, os.NewSyscallError("setsockopt", err)
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
sa, err := sockaddr(family, address)
|
|
sa, err := sockaddr(family, address)
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
|
|
+ syscall.Close(s)
|
|
|
return nil, err
|
|
return nil, err
|
|
|
}
|
|
}
|
|
|
if err := syscall.Bind(s, sa); err != nil {
|
|
if err := syscall.Bind(s, sa); err != nil {
|
|
|
|
|
+ syscall.Close(s)
|
|
|
return nil, os.NewSyscallError("bind", err)
|
|
return nil, os.NewSyscallError("bind", err)
|
|
|
}
|
|
}
|
|
|
f := os.NewFile(uintptr(s), "datagram-oriented icmp")
|
|
f := os.NewFile(uintptr(s), "datagram-oriented icmp")
|
|
|
- defer f.Close()
|
|
|
|
|
c, cerr = net.FilePacketConn(f)
|
|
c, cerr = net.FilePacketConn(f)
|
|
|
|
|
+ f.Close()
|
|
|
default:
|
|
default:
|
|
|
c, cerr = net.ListenPacket(network, address)
|
|
c, cerr = net.ListenPacket(network, address)
|
|
|
}
|
|
}
|