From 3b29e8e6f2258144a4eb073db150e6d76d5410bf Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Tue, 12 Jan 2016 12:27:55 +0000 Subject: [PATCH] Check for existing interfaces and routes after subscribing to receive new ones --- net/if.go | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/net/if.go b/net/if.go index 780f4290..79f43007 100644 --- a/net/if.go +++ b/net/if.go @@ -18,15 +18,16 @@ func EnsureInterface(ifaceName string) (*net.Interface, error) { } func ensureInterface(ifaceName string) (*net.Interface, error) { - if iface, err := findInterface(ifaceName); err == nil { - return iface, nil - } ch := make(chan netlink.LinkUpdate) done := make(chan struct{}) defer close(done) if err := netlink.LinkSubscribe(ch, done); err != nil { return nil, err } + // check for currently-existing interface after subscribing, to avoid race + if iface, err := findInterface(ifaceName); err == nil { + return iface, nil + } for update := range ch { if ifaceName == update.Link.Attrs().Name && update.IfInfomsg.Flags&syscall.IFF_UP != 0 { break @@ -44,16 +45,17 @@ func EnsureInterfaceAndMcastRoute(ifaceName string) (*net.Interface, error) { if err != nil { return nil, err } - dest := net.IPv4(224, 0, 0, 0) - if CheckRouteExists(ifaceName, dest) { - return iface, err - } ch := make(chan netlink.RouteUpdate) done := make(chan struct{}) defer close(done) if err := netlink.RouteSubscribe(ch, done); err != nil { return nil, err } + dest := net.IPv4(224, 0, 0, 0) + // check for currently-existing route after subscribing, to avoid race + if CheckRouteExists(ifaceName, dest) { + return iface, err + } for update := range ch { link, _ := netlink.LinkByIndex(update.Route.LinkIndex) if link.Attrs().Name == ifaceName && update.Route.Dst.IP.Equal(dest) {