diff --git a/daemon/container_operations.go b/daemon/container_operations.go index 7f9d30595d..c6a4e2cdf0 100644 --- a/daemon/container_operations.go +++ b/daemon/container_operations.go @@ -601,7 +601,7 @@ func normalizeEndpointIPAMConfig(errs []error, cfg *networktypes.EndpointIPAMCon } } for _, addr := range cfg.LinkLocalIPs { - if !addr.IsValid() || addr.IsUnspecified() { + if !addr.IsLinkLocalUnicast() || addr.Zone() != "" { errs = append(errs, fmt.Errorf("invalid link-local IP address: %s", addr)) } } diff --git a/daemon/container_operations_test.go b/daemon/container_operations_test.go index 03438aa16a..0ea5df0806 100644 --- a/daemon/container_operations_test.go +++ b/daemon/container_operations_test.go @@ -180,6 +180,27 @@ func TestEndpointIPAMConfigWithInvalidConfig(t *testing.T) { }, expectedErrors: []string{"invalid link-local IP address:"}, }, + { + name: "non-link-local IPv4 address as link-local", + ipamConfig: &networktypes.EndpointIPAMConfig{ + LinkLocalIPs: []netip.Addr{netip.MustParseAddr("10.0.0.5")}, + }, + expectedErrors: []string{"invalid link-local IP address: 10.0.0.5"}, + }, + { + name: "non-link-local IPv6 address as link-local", + ipamConfig: &networktypes.EndpointIPAMConfig{ + LinkLocalIPs: []netip.Addr{netip.MustParseAddr("2001:db8::1")}, + }, + expectedErrors: []string{"invalid link-local IP address: 2001:db8::1"}, + }, + { + name: "link-local address with a zone", + ipamConfig: &networktypes.EndpointIPAMConfig{ + LinkLocalIPs: []netip.Addr{netip.MustParseAddr("fe80::1%eth0")}, + }, + expectedErrors: []string{"invalid link-local IP address: fe80::1%eth0"}, + }, } for _, tc := range tests {