From 6b740c57bb9adcedac883491d47f723a1f029183 Mon Sep 17 00:00:00 2001 From: Sam Date: Tue, 2 Jan 2024 11:00:43 -0500 Subject: [PATCH] Fix infinite stack overflow if caching is disabled (#11669) --- .../relay/evm/mercury/wsrpc/cache/cache_set.go | 2 +- .../evm/mercury/wsrpc/cache/cache_set_test.go | 4 ++-- .../relay/evm/mercury/wsrpc/client_test.go | 17 ++++++++++------- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/core/services/relay/evm/mercury/wsrpc/cache/cache_set.go b/core/services/relay/evm/mercury/wsrpc/cache/cache_set.go index 01d47743950..7101cec39f3 100644 --- a/core/services/relay/evm/mercury/wsrpc/cache/cache_set.go +++ b/core/services/relay/evm/mercury/wsrpc/cache/cache_set.go @@ -67,7 +67,7 @@ func (cs *cacheSet) Close() error { func (cs *cacheSet) Get(ctx context.Context, client Client) (f Fetcher, err error) { if cs.cfg.LatestReportTTL == 0 { // caching disabled - return client, nil + return nil, nil } ok := cs.IfStarted(func() { f, err = cs.get(ctx, client) diff --git a/core/services/relay/evm/mercury/wsrpc/cache/cache_set_test.go b/core/services/relay/evm/mercury/wsrpc/cache/cache_set_test.go index 59be76ed265..f12dc8a9bc7 100644 --- a/core/services/relay/evm/mercury/wsrpc/cache/cache_set_test.go +++ b/core/services/relay/evm/mercury/wsrpc/cache/cache_set_test.go @@ -23,13 +23,13 @@ func Test_CacheSet(t *testing.T) { var err error var f Fetcher - t.Run("with caching disabled, returns the passed client", func(t *testing.T) { + t.Run("with caching disabled, returns nil, nil", func(t *testing.T) { assert.Len(t, disabledCs.caches, 0) f, err = disabledCs.Get(ctx, c) require.NoError(t, err) - assert.Same(t, c, f) + assert.Nil(t, f) assert.Len(t, disabledCs.caches, 0) }) diff --git a/core/services/relay/evm/mercury/wsrpc/client_test.go b/core/services/relay/evm/mercury/wsrpc/client_test.go index 10712461ae1..21accbf6d28 100644 --- a/core/services/relay/evm/mercury/wsrpc/client_test.go +++ b/core/services/relay/evm/mercury/wsrpc/client_test.go @@ -17,6 +17,14 @@ import ( "github.com/smartcontractkit/chainlink/v2/core/services/relay/evm/mercury/wsrpc/pb" ) +// simulate start without dialling +func simulateStart(ctx context.Context, t *testing.T, c *client) { + require.NoError(t, c.StartOnce("Mock WSRPC Client", func() (err error) { + c.cache, err = c.cacheSet.Get(ctx, c) + return err + })) +} + var _ cache.CacheSet = &mockCacheSet{} type mockCacheSet struct{} @@ -160,9 +168,8 @@ func Test_Client_LatestReport(t *testing.T) { c.conn = conn c.rawClient = wsrpcClient - // simulate start without dialling - require.NoError(t, c.StartOnce("Mock WSRPC Client", func() error { return nil })) servicetest.Run(t, cacheSet) + simulateStart(ctx, t, c) for i := 0; i < 5; i++ { r, err := c.LatestReport(ctx, req) @@ -195,12 +202,8 @@ func Test_Client_LatestReport(t *testing.T) { c.conn = conn c.rawClient = wsrpcClient - // simulate start without dialling - require.NoError(t, c.StartOnce("Mock WSRPC Client", func() error { return nil })) - var err error servicetest.Run(t, cacheSet) - c.cache, err = cacheSet.Get(ctx, c) - require.NoError(t, err) + simulateStart(ctx, t, c) for i := 0; i < 5; i++ { r, err := c.LatestReport(ctx, req)