]> Cypherpunks repositories - gostls13.git/commitdiff
net: fix fd leak with interfaces on aix/ppc64
authorClément Chigot <clement.chigot@atos.net>
Tue, 5 Mar 2019 15:05:07 +0000 (16:05 +0100)
committerBrad Fitzpatrick <bradfitz@golang.org>
Tue, 5 Mar 2019 15:11:20 +0000 (15:11 +0000)
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>
src/net/interface_aix.go

index 9a8b5bbdb1b224792ae70b9de768705f39f116a6..49f78c2abbcbfa78eba1c57e3f8755842dc4a095 100644 (file)
@@ -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