From d5127233e4e39349b29d168fbd15f9105499fa6e Mon Sep 17 00:00:00 2001 From: SashaMalysehko Date: Fri, 12 Dec 2025 19:09:35 +0200 Subject: [PATCH] fix: missing return after version header check (#16126) Ensure SubmitAttesterSlashingsV2 returns immediately when the Eth-Consensus-Version header is missing. Without this early return the handler calls version.FromString with an empty value and writes a second JSON error to the response, producing invalid JSON and duplicating error output. This change aligns the handler with the error-handling pattern used in other endpoints that validate the version header. --- beacon-chain/rpc/eth/beacon/handlers_pool.go | 1 + .../rpc/eth/beacon/handlers_pool_test.go | 27 +++++++++++++++++++ .../SashaMalysehko_fix-return-after-check.md | 3 +++ 3 files changed, 31 insertions(+) create mode 100644 changelog/SashaMalysehko_fix-return-after-check.md diff --git a/beacon-chain/rpc/eth/beacon/handlers_pool.go b/beacon-chain/rpc/eth/beacon/handlers_pool.go index 09d7eeaa23..b26b298976 100644 --- a/beacon-chain/rpc/eth/beacon/handlers_pool.go +++ b/beacon-chain/rpc/eth/beacon/handlers_pool.go @@ -711,6 +711,7 @@ func (s *Server) SubmitAttesterSlashingsV2(w http.ResponseWriter, r *http.Reques versionHeader := r.Header.Get(api.VersionHeader) if versionHeader == "" { httputil.HandleError(w, api.VersionHeader+" header is required", http.StatusBadRequest) + return } v, err := version.FromString(versionHeader) if err != nil { diff --git a/beacon-chain/rpc/eth/beacon/handlers_pool_test.go b/beacon-chain/rpc/eth/beacon/handlers_pool_test.go index 8fb48692ea..f86734b1b3 100644 --- a/beacon-chain/rpc/eth/beacon/handlers_pool_test.go +++ b/beacon-chain/rpc/eth/beacon/handlers_pool_test.go @@ -2112,6 +2112,33 @@ func TestSubmitAttesterSlashingsV2(t *testing.T) { assert.Equal(t, http.StatusBadRequest, e.Code) assert.StringContains(t, "Invalid attester slashing", e.Message) }) + + t.Run("missing-version-header", func(t *testing.T) { + bs, err := util.NewBeaconStateElectra() + require.NoError(t, err) + + broadcaster := &p2pMock.MockBroadcaster{} + s := &Server{ + ChainInfoFetcher: &blockchainmock.ChainService{State: bs}, + SlashingsPool: &slashingsmock.PoolMock{}, + Broadcaster: broadcaster, + } + + var body bytes.Buffer + _, err = body.WriteString(invalidAttesterSlashing) + require.NoError(t, err) + request := httptest.NewRequest(http.MethodPost, "http://example.com/beacon/pool/attester_slashings", &body) + // Intentionally do not set api.VersionHeader to verify missing header handling. + writer := httptest.NewRecorder() + writer.Body = &bytes.Buffer{} + + s.SubmitAttesterSlashingsV2(writer, request) + require.Equal(t, http.StatusBadRequest, writer.Code) + e := &httputil.DefaultJsonError{} + require.NoError(t, json.Unmarshal(writer.Body.Bytes(), e)) + assert.Equal(t, http.StatusBadRequest, e.Code) + assert.StringContains(t, api.VersionHeader+" header is required", e.Message) + }) } func TestSubmitProposerSlashing_InvalidSlashing(t *testing.T) { diff --git a/changelog/SashaMalysehko_fix-return-after-check.md b/changelog/SashaMalysehko_fix-return-after-check.md new file mode 100644 index 0000000000..65b5a14f66 --- /dev/null +++ b/changelog/SashaMalysehko_fix-return-after-check.md @@ -0,0 +1,3 @@ +## Fixed + +- Fix missing return after version header check in SubmitAttesterSlashingsV2.