Skip to content

coordinator: validate location before marshaling - #880

Open
damilolaedwards wants to merge 1 commit into
ethpandaops:masterfrom
damilolaedwards:fix/coordinator-location-validation
Open

coordinator: validate location before marshaling#880
damilolaedwards wants to merge 1 commit into
ethpandaops:masterfrom
damilolaedwards:fix/coordinator-location-validation

Conversation

@damilolaedwards

Copy link
Copy Markdown

Summary

UpsertCannonLocation and UpsertRelayMonitorLocation dereferenced the incoming location without checking for nil, so a request with the field omitted crashed the whole server. Both handlers now reject a nil location with InvalidArgument before touching it.

Marshal also accepted a request where the type was set but the matching data payload was missing, and silently wrote an empty marker instead of the real value. That marker looks like a valid location to every downstream reader, so it quietly resets whatever checkpoint or cursor the entry represented. Both the cannon and relay monitor Marshal implementations now reject this case with a new ErrLocationDataRequired error. The cannon implementation also had several types marshaling inline instead of going through the shared helper, so those were consolidated to keep the check in one place.

Added a recovery interceptor to the grpc server so a panic in a handler returns an internal error to the caller instead of taking down the process. This is a backstop for bugs like the one above, not a replacement for validating input.

Test plan

  • go build ./...
  • go test ./pkg/server/persistence/cannon/... ./pkg/server/persistence/relaymonitor/... ./pkg/server/service/coordinator/...
  • New tests cover: nil location on both handlers (with and without auth enabled), type set with data missing on both cannon and relay monitor locations, existing round trip and happy path cases still pass

UpsertCannonLocation and UpsertRelayMonitorLocation dereferenced the
incoming location without checking for nil, so a request with the
field omitted crashed the whole server. Both handlers now reject a
nil location with InvalidArgument before touching it.

Marshal also accepted a request where the type was set but the
matching data payload was missing, and silently wrote an empty
marker instead of the real value. That marker looks like a valid
location to every reader downstream, so it quietly resets whatever
checkpoint or cursor the entry represented. Both the cannon and
relay monitor Marshal implementations now reject this case with a
new ErrLocationDataRequired error. The cannon implementation also
had several types marshaling inline instead of going through the
shared helper, so those were consolidated to keep the check in one
place.

Added a recovery interceptor to the grpc server so a panic in a
handler returns an internal error to the caller instead of taking
down the process. This is a backstop for bugs like the one above,
not a replacement for validating input.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant