@@ -16,6 +16,28 @@ import (
16
16
"github.com/openshift/origin/pkg/util/netutils"
17
17
)
18
18
19
+ func validateCIDRv4 (cidr string ) (* net.IPNet , error ) {
20
+ ipnet , err := netutils .ParseCIDRMask (cidr )
21
+ if err != nil {
22
+ return nil , err
23
+ }
24
+ if ipnet .IP .To4 () == nil {
25
+ return nil , fmt .Errorf ("must be an IPv4 network" )
26
+ }
27
+ return ipnet , nil
28
+ }
29
+
30
+ func validateIPv4 (ip string ) (net.IP , error ) {
31
+ bytes := net .ParseIP (ip )
32
+ if bytes == nil {
33
+ return nil , fmt .Errorf ("invalid IP address" )
34
+ }
35
+ if bytes .To4 () == nil {
36
+ return nil , fmt .Errorf ("must be an IPv4 address" )
37
+ }
38
+ return bytes , nil
39
+ }
40
+
19
41
var defaultClusterNetwork * networkapi.ClusterNetwork
20
42
21
43
// SetDefaultClusterNetwork sets the expected value of the default ClusterNetwork record
@@ -30,7 +52,7 @@ func ValidateClusterNetwork(clusterNet *networkapi.ClusterNetwork) field.ErrorLi
30
52
31
53
if len (clusterNet .Network ) != 0 || clusterNet .HostSubnetLength != 0 {
32
54
//In the case that a user manually makes a clusterNetwork object with clusterNet.Network and clusterNet.HostubnetLength at least make sure they are valid values
33
- clusterIPNet , err := netutils . ParseCIDRMask (clusterNet .Network )
55
+ clusterIPNet , err := validateCIDRv4 (clusterNet .Network )
34
56
if err != nil {
35
57
allErrs = append (allErrs , field .Invalid (field .NewPath ("network" ), clusterNet .Network , err .Error ()))
36
58
} else {
@@ -46,12 +68,12 @@ func ValidateClusterNetwork(clusterNet *networkapi.ClusterNetwork) field.ErrorLi
46
68
if len (clusterNet .ClusterNetworks ) == 0 && len (clusterNet .Network ) == 0 {
47
69
allErrs = append (allErrs , field .Invalid (field .NewPath ("clusterNetworks" ), clusterNet .ClusterNetworks , "must have at least one cluster network CIDR" ))
48
70
}
49
- serviceIPNet , err := netutils . ParseCIDRMask (clusterNet .ServiceNetwork )
71
+ serviceIPNet , err := validateCIDRv4 (clusterNet .ServiceNetwork )
50
72
if err != nil {
51
73
allErrs = append (allErrs , field .Invalid (field .NewPath ("serviceNetwork" ), clusterNet .ServiceNetwork , err .Error ()))
52
74
}
53
75
for i , cn := range clusterNet .ClusterNetworks {
54
- clusterIPNet , err := netutils . ParseCIDRMask (cn .CIDR )
76
+ clusterIPNet , err := validateCIDRv4 (cn .CIDR )
55
77
if err != nil {
56
78
allErrs = append (allErrs , field .Invalid (field .NewPath ("clusterNetworks" ).Index (i ).Child ("cidr" ), cn .CIDR , err .Error ()))
57
79
continue
@@ -115,18 +137,19 @@ func ValidateHostSubnet(hs *networkapi.HostSubnet) field.ErrorList {
115
137
allErrs = append (allErrs , field .Invalid (field .NewPath ("subnet" ), hs .Subnet , "field cannot be empty" ))
116
138
}
117
139
} else {
118
- _ , err := netutils . ParseCIDRMask (hs .Subnet )
140
+ _ , err := validateCIDRv4 (hs .Subnet )
119
141
if err != nil {
120
142
allErrs = append (allErrs , field .Invalid (field .NewPath ("subnet" ), hs .Subnet , err .Error ()))
121
143
}
122
144
}
145
+ // In theory this has to be IPv4, but it's possible some clusters might be limping along with IPv6 values?
123
146
if net .ParseIP (hs .HostIP ) == nil {
124
147
allErrs = append (allErrs , field .Invalid (field .NewPath ("hostIP" ), hs .HostIP , "invalid IP address" ))
125
148
}
126
149
127
150
for i , egressIP := range hs .EgressIPs {
128
- if net . ParseIP (egressIP ) = = nil {
129
- allErrs = append (allErrs , field .Invalid (field .NewPath ("egressIPs" ).Index (i ), egressIP , "invalid IP address" ))
151
+ if _ , err := validateIPv4 (egressIP ); err ! = nil {
152
+ allErrs = append (allErrs , field .Invalid (field .NewPath ("egressIPs" ).Index (i ), egressIP , err . Error () ))
130
153
}
131
154
}
132
155
@@ -157,8 +180,8 @@ func ValidateNetNamespace(netnamespace *networkapi.NetNamespace) field.ErrorList
157
180
}
158
181
159
182
for i , ip := range netnamespace .EgressIPs {
160
- if net . ParseIP (ip ) = = nil {
161
- allErrs = append (allErrs , field .Invalid (field .NewPath ("egressIPs" ).Index (i ), ip , "invalid IP address" ))
183
+ if _ , err := validateIPv4 (ip ); err ! = nil {
184
+ allErrs = append (allErrs , field .Invalid (field .NewPath ("egressIPs" ).Index (i ), ip , err . Error () ))
162
185
}
163
186
}
164
187
0 commit comments