aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorClément Chigot <clement.chigot@atos.net>2019-03-05 16:05:07 +0100
committerBrad Fitzpatrick <bradfitz@golang.org>2019-03-05 15:11:20 +0000
commitb3fac018f15e653ed69f19f4c85c811ef2a62b9f (patch)
tree4bba53815e8d4bc9320da716a5244e9a61303666 /src
parent4c3f26076b6a9853bcc3c7d7e43726c044ac028a (diff)
downloadgo-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.go11
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