Skip to content

Commit 4e52d58

Browse files
author
Keith Nguyen
committed
test: invalid MAC address length
1 parent 15fc887 commit 4e52d58

File tree

2 files changed

+46
-12
lines changed

2 files changed

+46
-12
lines changed

cns/imds/client.go

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -46,17 +46,18 @@ func RetryAttempts(attempts uint) ClientOption {
4646
}
4747

4848
const (
49-
vmUniqueIDProperty = "vmId"
50-
imdsComputePath = "/metadata/instance/compute"
51-
imdsNetworkPath = "/metadata/instance/network"
52-
imdsVersionsPath = "/metadata/versions"
53-
imdsDefaultAPIVersion = "api-version=2021-01-01"
54-
imdsNCDetailsVersion = "api-version=2025-07-24"
55-
imdsFormatJSON = "format=json"
56-
metadataHeaderKey = "Metadata"
57-
metadataHeaderValue = "true"
58-
defaultRetryAttempts = 3
59-
defaultIMDSEndpoint = "http://169.254.169.254"
49+
vmUniqueIDProperty = "vmId"
50+
imdsComputePath = "/metadata/instance/compute"
51+
imdsNetworkPath = "/metadata/instance/network"
52+
imdsVersionsPath = "/metadata/versions"
53+
imdsDefaultAPIVersion = "api-version=2021-01-01"
54+
imdsNCDetailsVersion = "api-version=2025-07-24"
55+
imdsMACAddressStringLength = 12 // 6 bytes in hex equals 12 characters
56+
imdsFormatJSON = "format=json"
57+
metadataHeaderKey = "Metadata"
58+
metadataHeaderValue = "true"
59+
defaultRetryAttempts = 3
60+
defaultIMDSEndpoint = "http://169.254.169.254"
6061
)
6162

6263
var (
@@ -231,7 +232,7 @@ func (h *HardwareAddr) UnmarshalJSON(data []byte) error {
231232
// parseMacAddress is a wrapper around net.ParseMAC to handle Windows MAC address. Windows MAC addresse is a pure hex
232233
// dump without delimiter, so we need to add delimiters. This happens when CNS gets MAC address from IMDS.
233234
func parseMacAddress(s string) (net.HardwareAddr, error) {
234-
if !strings.ContainsAny(s, ":-.") && len(s)%2 == 0 {
235+
if !strings.ContainsAny(s, ":-.") && len(s) == imdsMACAddressStringLength {
235236
var sb strings.Builder
236237
for i := 0; i < len(s); i += 2 {
237238
if i > 0 {

cns/imds/client_test.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,39 @@ func TestGetNetworkInterfaces(t *testing.T) {
160160
assert.NotEqual(t, firstMAC.String(), secondMAC.String(), "MAC addresses should be different")
161161
}
162162

163+
func TestGetNetworkInterfacesInvalidMAC(t *testing.T) {
164+
networkInterfaces := []byte(`{
165+
"interface": [
166+
{
167+
"interfaceCompartmentID": "nc-12345-67890",
168+
"macAddress": "00005e00530"
169+
},
170+
]
171+
}`)
172+
173+
mockIMDSServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
174+
// request header "Metadata: true" must be present
175+
metadataHeader := r.Header.Get("Metadata")
176+
assert.Equal(t, "true", metadataHeader)
177+
178+
// verify path is network metadata
179+
assert.Contains(t, r.URL.Path, "/metadata/instance/network")
180+
181+
w.WriteHeader(http.StatusOK)
182+
_, writeErr := w.Write(networkInterfaces)
183+
if writeErr != nil {
184+
t.Errorf("error writing response: %v", writeErr)
185+
return
186+
}
187+
}))
188+
defer mockIMDSServer.Close()
189+
190+
imdsClient := imds.NewClient(imds.Endpoint(mockIMDSServer.URL))
191+
interfaces, err := imdsClient.GetNetworkInterfaces(context.Background())
192+
require.Error(t, err, "expected error for invalid MAC address")
193+
require.Nil(t, interfaces, "expected nil interfaces on error")
194+
}
195+
163196
func TestGetNetworkInterfacesInvalidEndpoint(t *testing.T) {
164197
imdsClient := imds.NewClient(imds.Endpoint(string([]byte{0x7f})), imds.RetryAttempts(1))
165198
_, err := imdsClient.GetNetworkInterfaces(context.Background())

0 commit comments

Comments
 (0)