فهرست منبع

ibnetwork/drivers/bridge: newLink: validate before creating

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
Sebastiaan van Stijn 2 سال پیش
والد
کامیت
2aa24519da
3فایلهای تغییر یافته به همراه21 افزوده شده و 5 حذف شده
  1. 8 2
      libnetwork/drivers/bridge/bridge.go
  2. 9 2
      libnetwork/drivers/bridge/link.go
  3. 4 1
      libnetwork/drivers/bridge/link_test.go

+ 8 - 2
libnetwork/drivers/bridge/bridge.go

@@ -1378,7 +1378,10 @@ func (d *driver) link(network *bridgeNetwork, endpoint *bridgeEndpoint, enable b
 				return InvalidEndpointIDError(p)
 				return InvalidEndpointIDError(p)
 			}
 			}
 
 
-			l := newLink(parentEndpoint.addr.IP, endpoint.addr.IP, ec.ExposedPorts, network.config.BridgeName)
+			l, err := newLink(parentEndpoint.addr.IP, endpoint.addr.IP, ec.ExposedPorts, network.config.BridgeName)
+			if err != nil {
+				return err
+			}
 			if enable {
 			if enable {
 				if err := l.Enable(); err != nil {
 				if err := l.Enable(); err != nil {
 					return err
 					return err
@@ -1402,7 +1405,10 @@ func (d *driver) link(network *bridgeNetwork, endpoint *bridgeEndpoint, enable b
 			continue
 			continue
 		}
 		}
 
 
-		l := newLink(endpoint.addr.IP, childEndpoint.addr.IP, childEndpoint.extConnConfig.ExposedPorts, network.config.BridgeName)
+		l, err := newLink(endpoint.addr.IP, childEndpoint.addr.IP, childEndpoint.extConnConfig.ExposedPorts, network.config.BridgeName)
+		if err != nil {
+			return err
+		}
 		if enable {
 		if enable {
 			if err := l.Enable(); err != nil {
 			if err := l.Enable(); err != nil {
 				return err
 				return err

+ 9 - 2
libnetwork/drivers/bridge/link.go

@@ -23,13 +23,20 @@ func (l *link) String() string {
 	return fmt.Sprintf("%s <-> %s [%v] on %s", l.parentIP, l.childIP, l.ports, l.bridge)
 	return fmt.Sprintf("%s <-> %s [%v] on %s", l.parentIP, l.childIP, l.ports, l.bridge)
 }
 }
 
 
-func newLink(parentIP, childIP net.IP, ports []types.TransportPort, bridge string) *link {
+func newLink(parentIP, childIP net.IP, ports []types.TransportPort, bridge string) (*link, error) {
+	if parentIP == nil {
+		return nil, fmt.Errorf("cannot link to a container with an empty parent IP address")
+	}
+	if childIP == nil {
+		return nil, fmt.Errorf("cannot link to a container with an empty child IP address")
+	}
+
 	return &link{
 	return &link{
 		childIP:  childIP,
 		childIP:  childIP,
 		parentIP: parentIP,
 		parentIP: parentIP,
 		ports:    ports,
 		ports:    ports,
 		bridge:   bridge,
 		bridge:   bridge,
-	}
+	}, nil
 }
 }
 
 
 func (l *link) Enable() error {
 func (l *link) Enable() error {

+ 4 - 1
libnetwork/drivers/bridge/link_test.go

@@ -29,7 +29,10 @@ func TestLinkNew(t *testing.T) {
 	parentIP := net.ParseIP(pIP)
 	parentIP := net.ParseIP(pIP)
 	childIP := net.ParseIP(cIP)
 	childIP := net.ParseIP(cIP)
 
 
-	l := newLink(parentIP, childIP, ports, bridgeName)
+	l, err := newLink(parentIP, childIP, ports, bridgeName)
+	if err != nil {
+		t.Errorf("unexpected error from newlink(): %v", err)
+	}
 	if l == nil {
 	if l == nil {
 		t.FailNow()
 		t.FailNow()
 	}
 	}