Skip to content

Commit

Permalink
eth/catalyst: fix validation of type 0 request (#31103)
Browse files Browse the repository at this point in the history
I caught this error on Hive. It was introduced by
#31071 because after adding
the equality check the request type 0 will be rejected.
  • Loading branch information
s1na authored Jan 31, 2025
1 parent 8daefeb commit fc12dbe
Show file tree
Hide file tree
Showing 2 changed files with 60 additions and 4 deletions.
6 changes: 2 additions & 4 deletions eth/catalyst/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -1272,18 +1272,16 @@ func convertRequests(hex []hexutil.Bytes) [][]byte {

// validateRequests checks that requests are ordered by their type and are not empty.
func validateRequests(requests [][]byte) error {
var last byte
for _, req := range requests {
for i, req := range requests {
// No empty requests.
if len(req) < 2 {
return fmt.Errorf("empty request: %v", req)
}
// Check that requests are ordered by their type.
// Each type must appear only once.
if req[0] <= last {
if i > 0 && req[0] <= requests[i-1][0] {
return fmt.Errorf("invalid request order: %v", req)
}
last = req[0]
}
return nil
}
58 changes: 58 additions & 0 deletions eth/catalyst/api_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1737,3 +1737,61 @@ func TestGetClientVersion(t *testing.T) {
t.Fatalf("client info does match expected, got %s", info.String())
}
}

func TestValidateRequests(t *testing.T) {
tests := []struct {
name string
requests [][]byte
wantErr bool
}{
{
name: "valid ascending",
requests: [][]byte{
{0x00, 0xAA, 0xBB}, // type 0x00
{0x01, 0xCC}, // type 0x01
{0x02, 0xDD}, // type 0x02
},
wantErr: false,
},
{
name: "empty request (too short)",
requests: [][]byte{
{0x00}, // only 1 byte: type with no data
},
wantErr: true,
},
{
name: "duplicate type",
requests: [][]byte{
{0x00, 0x11},
{0x01, 0x22},
{0x01, 0x33}, // duplicate type 0x01
},
wantErr: true,
},
{
name: "out of order",
requests: [][]byte{
{0x01, 0xAA}, // type 0x01
{0x00, 0xBB}, // type 0x00 out of order (should be ascending)
},
wantErr: true,
},
{
name: "single request valid",
requests: [][]byte{
{0x01, 0xAB},
},
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
err := validateRequests(tt.requests)
if (err != nil) != tt.wantErr {
t.Errorf("validateRequests(%v) error = %v, wantErr = %v",
tt.requests, err, tt.wantErr)
}
})
}
}

0 comments on commit fc12dbe

Please sign in to comment.