Jelajahi Sumber

Fix NPE due to null value returned by ep.Iface()

This PR carryforwards https://github.com/moby/libnetwork/pull/2239
and incorporates the suggestions in comments to fix the NPE and
potential NPEs due to a null value returned by ep.Iface()

Signed-off-by: Arko Dasgupta <arko.dasgupta@docker.com>
Arko Dasgupta 5 tahun lalu
induk
melakukan
c7f0b0152e
3 mengubah file dengan 7 tambahan dan 3 penghapusan
  1. 2 2
      libnetwork/agent.go
  2. 4 0
      libnetwork/controller.go
  3. 1 1
      libnetwork/network.go

+ 2 - 2
libnetwork/agent.go

@@ -596,7 +596,7 @@ func (ep *endpoint) deleteDriverInfoFromCluster() error {
 }
 }
 
 
 func (ep *endpoint) addServiceInfoToCluster(sb *sandbox) error {
 func (ep *endpoint) addServiceInfoToCluster(sb *sandbox) error {
-	if ep.isAnonymous() && len(ep.myAliases) == 0 || ep.Iface().Address() == nil {
+	if ep.isAnonymous() && len(ep.myAliases) == 0 || ep.Iface() == nil || ep.Iface().Address() == nil {
 		return nil
 		return nil
 	}
 	}
 
 
@@ -719,7 +719,7 @@ func (ep *endpoint) deleteServiceInfoFromCluster(sb *sandbox, fullRemove bool, m
 		}
 		}
 	}
 	}
 
 
-	if ep.Iface().Address() != nil {
+	if ep.Iface() != nil && ep.Iface().Address() != nil {
 		if ep.svcID != "" {
 		if ep.svcID != "" {
 			// This is a task part of a service
 			// This is a task part of a service
 			var ingressPorts []*PortConfig
 			var ingressPorts []*PortConfig

+ 4 - 0
libnetwork/controller.go

@@ -979,6 +979,10 @@ func (c *controller) reservePools() {
 			continue
 			continue
 		}
 		}
 		for _, ep := range epl {
 		for _, ep := range epl {
+			if ep.Iface() == nil {
+				logrus.Warnf("endpoint interface is empty for %q (%s)", ep.Name(), ep.ID())
+				continue
+			}
 			if err := ep.assignAddress(ipam, true, ep.Iface().AddressIPv6() != nil); err != nil {
 			if err := ep.assignAddress(ipam, true, ep.Iface().AddressIPv6() != nil); err != nil {
 				logrus.Warnf("Failed to reserve current address for endpoint %q (%s) on network %q (%s)",
 				logrus.Warnf("Failed to reserve current address for endpoint %q (%s) on network %q (%s)",
 					ep.Name(), ep.ID(), n.Name(), n.ID())
 					ep.Name(), ep.ID(), n.Name(), n.ID())

+ 1 - 1
libnetwork/network.go

@@ -1329,7 +1329,7 @@ func (n *network) EndpointByID(id string) (Endpoint, error) {
 func (n *network) updateSvcRecord(ep *endpoint, localEps []*endpoint, isAdd bool) {
 func (n *network) updateSvcRecord(ep *endpoint, localEps []*endpoint, isAdd bool) {
 	var ipv6 net.IP
 	var ipv6 net.IP
 	epName := ep.Name()
 	epName := ep.Name()
-	if iface := ep.Iface(); iface.Address() != nil {
+	if iface := ep.Iface(); iface != nil && iface.Address() != nil {
 		myAliases := ep.MyAliases()
 		myAliases := ep.MyAliases()
 		if iface.AddressIPv6() != nil {
 		if iface.AddressIPv6() != nil {
 			ipv6 = iface.AddressIPv6().IP
 			ipv6 = iface.AddressIPv6().IP