mirror of https://github.com/golang/go.git
net: fix fd leak with interfaces on aix/ppc64
To retrieve MTU on aix/ppc64, a socket must be created. Previously, this socket was recreated for each interface and not close at all, causing a fd leak on software using interface API. Change-Id: Ib573e234bfce58964935831b68d007bfbd923476 Reviewed-on: https://go-review.googlesource.com/c/go/+/165397 Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
This commit is contained in:
parent
4c3f26076b
commit
b3fac018f1
|
|
@ -5,6 +5,7 @@
|
|||
package net
|
||||
|
||||
import (
|
||||
"internal/poll"
|
||||
"internal/syscall/unix"
|
||||
"syscall"
|
||||
"unsafe"
|
||||
|
|
@ -54,6 +55,12 @@ func interfaceTable(ifindex int) ([]Interface, error) {
|
|||
return nil, err
|
||||
}
|
||||
|
||||
sock, err := sysSocket(syscall.AF_INET, syscall.SOCK_DGRAM, 0)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer poll.CloseFunc(sock)
|
||||
|
||||
var ift []Interface
|
||||
for len(tab) > 0 {
|
||||
ifm := (*syscall.IfMsgHdr)(unsafe.Pointer(&tab[0]))
|
||||
|
|
@ -71,10 +78,6 @@ func interfaceTable(ifindex int) ([]Interface, error) {
|
|||
// Retrieve MTU
|
||||
ifr := &ifreq{}
|
||||
copy(ifr.Name[:], ifi.Name)
|
||||
sock, err := syscall.Socket(syscall.AF_INET, syscall.SOCK_DGRAM, 0)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
err = unix.Ioctl(sock, syscall.SIOCGIFMTU, uintptr(unsafe.Pointer(ifr)))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
|
|
|
|||
Loading…
Reference in New Issue