From 179bbb56b7a9834eaa94ef5a866562f27fa7c1e3 Mon Sep 17 00:00:00 2001 From: Ivan Ka <5395690+ivankatliarchuk@users.noreply.github.com> Date: Sat, 12 Jul 2025 18:41:29 +0100 Subject: [PATCH] fix(provider/aws): null pointer when records mailformed (#5639) * fix(provider/aws): null pointer when records mailformed Signed-off-by: ivan katliarchuk * fix(provider/aws): null pointer when records mailformed Co-authored-by: Michel Loiseleur <97035654+mloiseleur@users.noreply.github.com> * fix(provider/aws): null pointer when records mailformed Signed-off-by: ivan katliarchuk --------- Signed-off-by: ivan katliarchuk Co-authored-by: Michel Loiseleur <97035654+mloiseleur@users.noreply.github.com> --- provider/aws/aws.go | 4 ++++ provider/aws/aws_test.go | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/provider/aws/aws.go b/provider/aws/aws.go index a5796ae1a..1ddb35cce 100644 --- a/provider/aws/aws.go +++ b/provider/aws/aws.go @@ -641,6 +641,10 @@ func (p *AWSProvider) createUpdateChanges(newEndpoints, oldEndpoints []*endpoint var updates []*endpoint.Endpoint for i, newE := range newEndpoints { + if i >= len(oldEndpoints) || oldEndpoints[i] == nil { + log.Debugf("skip %s as endpoint not found in current endpoints", newE.DNSName) + continue + } oldE := oldEndpoints[i] if p.requiresDeleteCreate(oldE, newE) { deletes = append(deletes, oldE) diff --git a/provider/aws/aws_test.go b/provider/aws/aws_test.go index 474c97250..a269c3ede 100644 --- a/provider/aws/aws_test.go +++ b/provider/aws/aws_test.go @@ -2817,3 +2817,36 @@ func TestGeoProximityWithBias(t *testing.T) { }) } } + +func TestAWSProvider_createUpdateChanges_NewMoreThanOld(t *testing.T) { + provider, _ := newAWSProvider(t, endpoint.NewDomainFilter([]string{"foo.bar."}), provider.NewZoneIDFilter([]string{}), provider.NewZoneTypeFilter(""), true, false, nil) + + oldEndpoints := []*endpoint.Endpoint{ + endpoint.NewEndpointWithTTL("record1.foo.bar.", endpoint.RecordTypeA, endpoint.TTL(300), "1.1.1.1"), + nil, + } + newEndpoints := []*endpoint.Endpoint{ + endpoint.NewEndpointWithTTL("record1.foo.bar.", endpoint.RecordTypeA, endpoint.TTL(300), "1.1.1.1"), + endpoint.NewEndpointWithTTL("record2.foo.bar.", endpoint.RecordTypeA, endpoint.TTL(300), "2.2.2.2"), + endpoint.NewEndpointWithTTL("record3.foo.bar.", endpoint.RecordTypeA, endpoint.TTL(300), "3.3.3.3"), + } + + changes := provider.createUpdateChanges(newEndpoints, oldEndpoints) + + // record2 should be created, record1 should be upserted + var creates, upserts, deletes int + for _, c := range changes { + switch c.Action { + case route53types.ChangeActionCreate: + creates++ + case route53types.ChangeActionUpsert: + upserts++ + case route53types.ChangeActionDelete: + deletes++ + } + } + + require.Equal(t, 0, creates, "should create the extra new endpoint") + require.Equal(t, 1, upserts, "should upsert the matching endpoint") + require.Equal(t, 0, deletes, "should not delete anything") +}