Skip to content

Commit 01d6c56

Browse files
sjbermannowjean
authored andcommitted
Fix crash when BackendRef filter is specified (nginx#3508)
Problem: When a BackendRef filter is specified in a Route, the control plane crashes due to an index out of range error. Solution: Fix the way we build the filter list so we don't access an undefined index.
1 parent 540556b commit 01d6c56

File tree

2 files changed

+52
-23
lines changed

2 files changed

+52
-23
lines changed

internal/controller/state/graph/httproute.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -187,11 +187,11 @@ func processHTTPRouteRule(
187187

188188
// rule.BackendRefs are validated separately because of their special requirements
189189
for _, b := range specRule.BackendRefs {
190-
var interfaceFilters []interface{}
190+
var interfaceFilters []any
191191
if len(b.Filters) > 0 {
192-
interfaceFilters = make([]interface{}, 0, len(b.Filters))
193-
for i, v := range b.Filters {
194-
interfaceFilters[i] = v
192+
interfaceFilters = make([]any, 0, len(b.Filters))
193+
for _, filter := range b.Filters {
194+
interfaceFilters = append(interfaceFilters, filter)
195195
}
196196
}
197197
rbr := RouteBackendRef{
@@ -211,7 +211,7 @@ func processHTTPRouteRule(
211211
BackendRef: v1.BackendRef{
212212
BackendObjectReference: filter.RequestMirror.BackendRef,
213213
},
214-
MirrorBackendIdx: helpers.GetPointer[int](i),
214+
MirrorBackendIdx: helpers.GetPointer(i),
215215
}
216216
backendRefs = append(backendRefs, rbr)
217217
}

internal/controller/state/graph/httproute_test.go

Lines changed: 47 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,21 @@ func createHTTPRoute(
5151
},
5252
},
5353
},
54+
BackendRefs: []gatewayv1.HTTPBackendRef{
55+
{
56+
BackendRef: gatewayv1.BackendRef{
57+
BackendObjectReference: gatewayv1.BackendObjectReference{
58+
Kind: helpers.GetPointer[gatewayv1.Kind](kinds.Service),
59+
Name: "backend",
60+
},
61+
},
62+
Filters: []gatewayv1.HTTPRouteFilter{
63+
{
64+
Type: gatewayv1.HTTPRouteFilterExtensionRef,
65+
},
66+
},
67+
},
68+
},
5469
})
5570
}
5671

@@ -88,6 +103,20 @@ func addFilterToPath(hr *gatewayv1.HTTPRoute, path string, filter gatewayv1.HTTP
88103
}
89104
}
90105

106+
var expRouteBackendRef = RouteBackendRef{
107+
BackendRef: gatewayv1.BackendRef{
108+
BackendObjectReference: gatewayv1.BackendObjectReference{
109+
Kind: helpers.GetPointer[gatewayv1.Kind](kinds.Service),
110+
Name: "backend",
111+
},
112+
},
113+
Filters: []any{
114+
gatewayv1.HTTPRouteFilter{
115+
Type: gatewayv1.HTTPRouteFilterExtensionRef,
116+
},
117+
},
118+
}
119+
91120
func TestBuildHTTPRoutes(t *testing.T) {
92121
t.Parallel()
93122

@@ -196,7 +225,7 @@ func TestBuildHTTPRoutes(t *testing.T) {
196225
},
197226
},
198227
Matches: hr.Spec.Rules[0].Matches,
199-
RouteBackendRefs: []RouteBackendRef{},
228+
RouteBackendRefs: []RouteBackendRef{expRouteBackendRef},
200229
},
201230
},
202231
},
@@ -394,7 +423,7 @@ func TestBuildHTTPRoute(t *testing.T) {
394423
Filters: []Filter{},
395424
},
396425
Matches: hr.Spec.Rules[0].Matches,
397-
RouteBackendRefs: []RouteBackendRef{},
426+
RouteBackendRefs: []RouteBackendRef{expRouteBackendRef},
398427
},
399428
{
400429
ValidMatches: true,
@@ -403,7 +432,7 @@ func TestBuildHTTPRoute(t *testing.T) {
403432
Filters: convertHTTPRouteFilters(hr.Spec.Rules[1].Filters),
404433
},
405434
Matches: hr.Spec.Rules[1].Matches,
406-
RouteBackendRefs: []RouteBackendRef{},
435+
RouteBackendRefs: []RouteBackendRef{expRouteBackendRef},
407436
},
408437
},
409438
},
@@ -439,7 +468,7 @@ func TestBuildHTTPRoute(t *testing.T) {
439468
Valid: true,
440469
Filters: []Filter{},
441470
},
442-
RouteBackendRefs: []RouteBackendRef{},
471+
RouteBackendRefs: []RouteBackendRef{expRouteBackendRef},
443472
Matches: hrInvalidMatchesEmptyPathType.Spec.Rules[0].Matches,
444473
},
445474
},
@@ -485,7 +514,7 @@ func TestBuildHTTPRoute(t *testing.T) {
485514
Valid: true,
486515
Filters: []Filter{},
487516
},
488-
RouteBackendRefs: []RouteBackendRef{},
517+
RouteBackendRefs: []RouteBackendRef{expRouteBackendRef},
489518
Matches: hrInvalidMatchesEmptyPathValue.Spec.Rules[0].Matches,
490519
},
491520
},
@@ -552,7 +581,7 @@ func TestBuildHTTPRoute(t *testing.T) {
552581
Filters: []Filter{},
553582
},
554583
Matches: hrInvalidMatches.Spec.Rules[0].Matches,
555-
RouteBackendRefs: []RouteBackendRef{},
584+
RouteBackendRefs: []RouteBackendRef{expRouteBackendRef},
556585
},
557586
},
558587
},
@@ -590,7 +619,7 @@ func TestBuildHTTPRoute(t *testing.T) {
590619
Filters: convertHTTPRouteFilters(hrInvalidFilters.Spec.Rules[0].Filters),
591620
},
592621
Matches: hrInvalidFilters.Spec.Rules[0].Matches,
593-
RouteBackendRefs: []RouteBackendRef{},
622+
RouteBackendRefs: []RouteBackendRef{expRouteBackendRef},
594623
},
595624
},
596625
},
@@ -627,7 +656,7 @@ func TestBuildHTTPRoute(t *testing.T) {
627656
Filters: []Filter{},
628657
},
629658
Matches: hrDroppedInvalidMatches.Spec.Rules[0].Matches,
630-
RouteBackendRefs: []RouteBackendRef{},
659+
RouteBackendRefs: []RouteBackendRef{expRouteBackendRef},
631660
},
632661
{
633662
ValidMatches: true,
@@ -636,7 +665,7 @@ func TestBuildHTTPRoute(t *testing.T) {
636665
Filters: []Filter{},
637666
},
638667
Matches: hrDroppedInvalidMatches.Spec.Rules[1].Matches,
639-
RouteBackendRefs: []RouteBackendRef{},
668+
RouteBackendRefs: []RouteBackendRef{expRouteBackendRef},
640669
},
641670
},
642671
},
@@ -676,7 +705,7 @@ func TestBuildHTTPRoute(t *testing.T) {
676705
Filters: []Filter{},
677706
},
678707
Matches: hrDroppedInvalidMatchesAndInvalidFilters.Spec.Rules[0].Matches,
679-
RouteBackendRefs: []RouteBackendRef{},
708+
RouteBackendRefs: []RouteBackendRef{expRouteBackendRef},
680709
},
681710
{
682711
ValidMatches: true,
@@ -687,7 +716,7 @@ func TestBuildHTTPRoute(t *testing.T) {
687716
hrDroppedInvalidMatchesAndInvalidFilters.Spec.Rules[1].Filters,
688717
),
689718
},
690-
RouteBackendRefs: []RouteBackendRef{},
719+
RouteBackendRefs: []RouteBackendRef{expRouteBackendRef},
691720
},
692721
{
693722
ValidMatches: true,
@@ -696,7 +725,7 @@ func TestBuildHTTPRoute(t *testing.T) {
696725
Filters: []Filter{},
697726
},
698727
Matches: hrDroppedInvalidMatchesAndInvalidFilters.Spec.Rules[2].Matches,
699-
RouteBackendRefs: []RouteBackendRef{},
728+
RouteBackendRefs: []RouteBackendRef{expRouteBackendRef},
700729
},
701730
},
702731
},
@@ -734,7 +763,7 @@ func TestBuildHTTPRoute(t *testing.T) {
734763
Filters: convertHTTPRouteFilters(hrDroppedInvalidFilters.Spec.Rules[0].Filters),
735764
Valid: true,
736765
},
737-
RouteBackendRefs: []RouteBackendRef{},
766+
RouteBackendRefs: []RouteBackendRef{expRouteBackendRef},
738767
},
739768
{
740769
ValidMatches: true,
@@ -743,7 +772,7 @@ func TestBuildHTTPRoute(t *testing.T) {
743772
Filters: convertHTTPRouteFilters(hrDroppedInvalidFilters.Spec.Rules[1].Filters),
744773
Valid: false,
745774
},
746-
RouteBackendRefs: []RouteBackendRef{},
775+
RouteBackendRefs: []RouteBackendRef{expRouteBackendRef},
747776
},
748777
},
749778
},
@@ -785,7 +814,7 @@ func TestBuildHTTPRoute(t *testing.T) {
785814
},
786815
Valid: true,
787816
},
788-
RouteBackendRefs: []RouteBackendRef{},
817+
RouteBackendRefs: []RouteBackendRef{expRouteBackendRef},
789818
},
790819
},
791820
},
@@ -823,7 +852,7 @@ func TestBuildHTTPRoute(t *testing.T) {
823852
Filters: convertHTTPRouteFilters(hrInvalidSnippetsFilter.Spec.Rules[0].Filters),
824853
Valid: false,
825854
},
826-
RouteBackendRefs: []RouteBackendRef{},
855+
RouteBackendRefs: []RouteBackendRef{expRouteBackendRef},
827856
},
828857
},
829858
},
@@ -862,7 +891,7 @@ func TestBuildHTTPRoute(t *testing.T) {
862891
Filters: convertHTTPRouteFilters(hrUnresolvableSnippetsFilter.Spec.Rules[0].Filters),
863892
Valid: false,
864893
},
865-
RouteBackendRefs: []RouteBackendRef{},
894+
RouteBackendRefs: []RouteBackendRef{expRouteBackendRef},
866895
},
867896
},
868897
},
@@ -907,7 +936,7 @@ func TestBuildHTTPRoute(t *testing.T) {
907936
),
908937
Valid: false,
909938
},
910-
RouteBackendRefs: []RouteBackendRef{},
939+
RouteBackendRefs: []RouteBackendRef{expRouteBackendRef},
911940
},
912941
},
913942
},

0 commit comments

Comments
 (0)