diff options
| author | Clément Chigot <clement.chigot@atos.net> | 2019-03-05 16:05:07 +0100 |
|---|---|---|
| committer | Brad Fitzpatrick <bradfitz@golang.org> | 2019-03-05 15:11:20 +0000 |
| commit | b3fac018f15e653ed69f19f4c85c811ef2a62b9f (patch) | |
| tree | 4bba53815e8d4bc9320da716a5244e9a61303666 /src | |
| parent | 4c3f26076b6a9853bcc3c7d7e43726c044ac028a (diff) | |
| download | go-b3fac018f15e653ed69f19f4c85c811ef2a62b9f.tar.xz | |
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>
Diffstat (limited to 'src')
| -rw-r--r-- | src/net/interface_aix.go | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/src/net/interface_aix.go b/src/net/interface_aix.go index 9a8b5bbdb1..49f78c2abb 100644 --- a/src/net/interface_aix.go +++ b/src/net/interface_aix.go @@ -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 |
