Skip to content

Commit 3ce1a5b

Browse files
authored
AzureMonitor: Fix out of bounds error when accessing metricNamespaceArray and resourceNameArray in buildResourceURI (#89222)
Fix out of range error when accessing metricNamespaceArray in buildResourceURI
1 parent 9db3bc9 commit 3ce1a5b

File tree

2 files changed

+72
-3
lines changed

2 files changed

+72
-3
lines changed

pkg/tsdb/azuremonitor/metrics/url-builder.go

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,19 @@ func (params *urlBuilder) buildResourceURI() (*string, error) {
3939
}
4040

4141
metricNamespaceArray := strings.Split(*metricNamespace, "/")
42+
43+
provider := ""
44+
if len(metricNamespaceArray) > 1 {
45+
provider = metricNamespaceArray[0]
46+
metricNamespaceArray = metricNamespaceArray[1:]
47+
} else {
48+
return nil, fmt.Errorf("metricNamespace is not in the correct format")
49+
}
50+
4251
var resourceNameArray []string
4352
if params.ResourceName != nil && *params.ResourceName != "" {
4453
resourceNameArray = strings.Split(*params.ResourceName, "/")
4554
}
46-
provider := metricNamespaceArray[0]
47-
metricNamespaceArray = metricNamespaceArray[1:]
4855

4956
if strings.HasPrefix(strings.ToLower(*metricNamespace), "microsoft.storage/storageaccounts/") &&
5057
params.ResourceName != nil &&
@@ -66,7 +73,11 @@ func (params *urlBuilder) buildResourceURI() (*string, error) {
6673
}
6774

6875
for i, namespace := range metricNamespaceArray {
69-
urlArray = append(urlArray, namespace, resourceNameArray[i])
76+
if i < len(resourceNameArray) {
77+
urlArray = append(urlArray, namespace, resourceNameArray[i])
78+
} else {
79+
return nil, fmt.Errorf("resourceNameArray does not have enough elements")
80+
}
7081
}
7182

7283
resourceURI := strings.Join(urlArray, "/")

pkg/tsdb/azuremonitor/metrics/url-builder_test.go

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package metrics
22

33
import (
4+
"strings"
45
"testing"
56

67
"github.com/stretchr/testify/assert"
@@ -145,5 +146,62 @@ func TestBuildResourceURI(t *testing.T) {
145146
}
146147
}
147148
})
149+
150+
t.Run("provider extraction from metricNamespaceArray", func(t *testing.T) {
151+
ub := &urlBuilder{
152+
DefaultSubscription: strPtr("default-sub"),
153+
MetricNamespace: strPtr("provider1/service1"),
154+
ResourceGroup: strPtr("rg"),
155+
ResourceName: strPtr("rn1/rn2/rn3"),
156+
}
157+
expectedProvider := "provider1"
158+
159+
uri, err := ub.buildResourceURI()
160+
if err != nil {
161+
t.Errorf("Unexpected error: %v", err)
162+
}
163+
if uri == nil {
164+
t.Fatalf("Expected non-nil uri")
165+
}
166+
if !strings.Contains(*uri, expectedProvider) {
167+
t.Errorf("Expected provider %v in uri %v", expectedProvider, *uri)
168+
}
169+
})
170+
171+
t.Run("when metricNamespace is not in the correct format", func(t *testing.T) {
172+
ub := &urlBuilder{
173+
DefaultSubscription: strPtr("default-sub"),
174+
MetricNamespace: strPtr("invalidformat"),
175+
}
176+
177+
_, err := ub.buildResourceURI()
178+
if err == nil || err.Error() != "metricNamespace is not in the correct format" {
179+
t.Errorf("Expected error: metricNamespace is not in the correct format")
180+
}
181+
})
182+
183+
t.Run("when resourceNameArray index out of range", func(t *testing.T) {
184+
ub := &urlBuilder{
185+
DefaultSubscription: strPtr("default-sub"),
186+
MetricNamespace: strPtr("provider1/service1"),
187+
ResourceName: strPtr("rn1/rn2/rn3"),
188+
}
189+
190+
_, err := ub.buildResourceURI()
191+
if err != nil {
192+
t.Errorf("Unexpected error: %v", err)
193+
}
194+
195+
ub = &urlBuilder{
196+
DefaultSubscription: strPtr("default-sub"),
197+
MetricNamespace: strPtr("provider1/service1/service2"),
198+
ResourceName: strPtr(""),
199+
}
200+
201+
_, err = ub.buildResourceURI()
202+
if err == nil || err.Error() != "resourceNameArray does not have enough elements" {
203+
t.Errorf("Expected error: resourceNameArray does not have enough elements")
204+
}
205+
})
148206
})
149207
}

0 commit comments

Comments
 (0)