Commit b3fac018 authored by Clément Chigot's avatar Clément Chigot Committed by Brad Fitzpatrick

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/+/165397Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
parent 4c3f2607
...@@ -5,6 +5,7 @@ ...@@ -5,6 +5,7 @@
package net package net
import ( import (
"internal/poll"
"internal/syscall/unix" "internal/syscall/unix"
"syscall" "syscall"
"unsafe" "unsafe"
...@@ -54,6 +55,12 @@ func interfaceTable(ifindex int) ([]Interface, error) { ...@@ -54,6 +55,12 @@ func interfaceTable(ifindex int) ([]Interface, error) {
return nil, err 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 var ift []Interface
for len(tab) > 0 { for len(tab) > 0 {
ifm := (*syscall.IfMsgHdr)(unsafe.Pointer(&tab[0])) ifm := (*syscall.IfMsgHdr)(unsafe.Pointer(&tab[0]))
...@@ -71,10 +78,6 @@ func interfaceTable(ifindex int) ([]Interface, error) { ...@@ -71,10 +78,6 @@ func interfaceTable(ifindex int) ([]Interface, error) {
// Retrieve MTU // Retrieve MTU
ifr := &ifreq{} ifr := &ifreq{}
copy(ifr.Name[:], ifi.Name) 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))) err = unix.Ioctl(sock, syscall.SIOCGIFMTU, uintptr(unsafe.Pointer(ifr)))
if err != nil { if err != nil {
return nil, err return nil, err
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment