From 3ce1a5b0caab215346a51629b0344b90d67e9478 Mon Sep 17 00:00:00 2001 From: Adam Yeats <16296989+adamyeats@users.noreply.github.com> Date: Thu, 25 Jul 2024 11:19:15 +0100 Subject: [PATCH] AzureMonitor: Fix out of bounds error when accessing `metricNamespaceArray` and `resourceNameArray` in `buildResourceURI` (#89222) Fix out of range error when accessing metricNamespaceArray in buildResourceURI --- pkg/tsdb/azuremonitor/metrics/url-builder.go | 17 +++++- .../azuremonitor/metrics/url-builder_test.go | 58 +++++++++++++++++++ 2 files changed, 72 insertions(+), 3 deletions(-) diff --git a/pkg/tsdb/azuremonitor/metrics/url-builder.go b/pkg/tsdb/azuremonitor/metrics/url-builder.go index 1d1b015ed78..a7ae29e1fd0 100644 --- a/pkg/tsdb/azuremonitor/metrics/url-builder.go +++ b/pkg/tsdb/azuremonitor/metrics/url-builder.go @@ -39,12 +39,19 @@ func (params *urlBuilder) buildResourceURI() (*string, error) { } metricNamespaceArray := strings.Split(*metricNamespace, "/") + + provider := "" + if len(metricNamespaceArray) > 1 { + provider = metricNamespaceArray[0] + metricNamespaceArray = metricNamespaceArray[1:] + } else { + return nil, fmt.Errorf("metricNamespace is not in the correct format") + } + var resourceNameArray []string if params.ResourceName != nil && *params.ResourceName != "" { resourceNameArray = strings.Split(*params.ResourceName, "/") } - provider := metricNamespaceArray[0] - metricNamespaceArray = metricNamespaceArray[1:] if strings.HasPrefix(strings.ToLower(*metricNamespace), "microsoft.storage/storageaccounts/") && params.ResourceName != nil && @@ -66,7 +73,11 @@ func (params *urlBuilder) buildResourceURI() (*string, error) { } for i, namespace := range metricNamespaceArray { - urlArray = append(urlArray, namespace, resourceNameArray[i]) + if i < len(resourceNameArray) { + urlArray = append(urlArray, namespace, resourceNameArray[i]) + } else { + return nil, fmt.Errorf("resourceNameArray does not have enough elements") + } } resourceURI := strings.Join(urlArray, "/") diff --git a/pkg/tsdb/azuremonitor/metrics/url-builder_test.go b/pkg/tsdb/azuremonitor/metrics/url-builder_test.go index 2c06308d9bd..44793185e5a 100644 --- a/pkg/tsdb/azuremonitor/metrics/url-builder_test.go +++ b/pkg/tsdb/azuremonitor/metrics/url-builder_test.go @@ -1,6 +1,7 @@ package metrics import ( + "strings" "testing" "github.com/stretchr/testify/assert" @@ -145,5 +146,62 @@ func TestBuildResourceURI(t *testing.T) { } } }) + + t.Run("provider extraction from metricNamespaceArray", func(t *testing.T) { + ub := &urlBuilder{ + DefaultSubscription: strPtr("default-sub"), + MetricNamespace: strPtr("provider1/service1"), + ResourceGroup: strPtr("rg"), + ResourceName: strPtr("rn1/rn2/rn3"), + } + expectedProvider := "provider1" + + uri, err := ub.buildResourceURI() + if err != nil { + t.Errorf("Unexpected error: %v", err) + } + if uri == nil { + t.Fatalf("Expected non-nil uri") + } + if !strings.Contains(*uri, expectedProvider) { + t.Errorf("Expected provider %v in uri %v", expectedProvider, *uri) + } + }) + + t.Run("when metricNamespace is not in the correct format", func(t *testing.T) { + ub := &urlBuilder{ + DefaultSubscription: strPtr("default-sub"), + MetricNamespace: strPtr("invalidformat"), + } + + _, err := ub.buildResourceURI() + if err == nil || err.Error() != "metricNamespace is not in the correct format" { + t.Errorf("Expected error: metricNamespace is not in the correct format") + } + }) + + t.Run("when resourceNameArray index out of range", func(t *testing.T) { + ub := &urlBuilder{ + DefaultSubscription: strPtr("default-sub"), + MetricNamespace: strPtr("provider1/service1"), + ResourceName: strPtr("rn1/rn2/rn3"), + } + + _, err := ub.buildResourceURI() + if err != nil { + t.Errorf("Unexpected error: %v", err) + } + + ub = &urlBuilder{ + DefaultSubscription: strPtr("default-sub"), + MetricNamespace: strPtr("provider1/service1/service2"), + ResourceName: strPtr(""), + } + + _, err = ub.buildResourceURI() + if err == nil || err.Error() != "resourceNameArray does not have enough elements" { + t.Errorf("Expected error: resourceNameArray does not have enough elements") + } + }) }) }