Skip to content

EndOfRLPException should be treated as invalid packet in peer discovery #9596

@jflo

Description

@jflo

Problem

When processing peer discovery packets, org.apache.tuweni.rlp.EndOfRLPException is not caught as a packet decoding issue and is instead logged as an error. This exception indicates a malformed RLP-encoded packet and should be discarded quietly like other decoding exceptions.

Stack Trace

org.apache.tuweni.rlp.EndOfRLPException: End of RLP source reached
    at org.apache.tuweni.rlp.BytesRLPReader.readValue(BytesRLPReader.java:38)
    at org.apache.tuweni.rlp.RLPReader.readValue(RLPReader.java:38)
    at org.ethereum.beacon.discovery.schema.NodeRecordFactory.lambda$fromRlp$0(NodeRecordFactory.java:79)
    at org.apache.tuweni.rlp.BytesRLPReader.readList(BytesRLPReader.java:114)
    at org.apache.tuweni.rlp.RLPReader.readList(RLPReader.java:280)
    at org.ethereum.beacon.discovery.schema.NodeRecordFactory.fromRlp(NodeRecordFactory.java:77)
    at org.apache.tuweni.rlp.RLP.decode(RLP.java:262)
    at org.apache.tuweni.rlp.RLP.decode(RLP.java:242)
    at org.ethereum.beacon.discovery.schema.NodeRecordFactory.fromBytes(NodeRecordFactory.java:137)
    at org.ethereum.beacon.discovery.schema.NodeRecordFactory.fromBytes(NodeRecordFactory.java:73)
    at org.hyperledger.besu.ethereum.p2p.discovery.internal.packet.enrresponse.EnrResponsePacketDataRlpReader.readFrom(EnrResponsePacketDataRlpReader.java:46)
    at org.hyperledger.besu.ethereum.p2p.discovery.internal.packet.enrresponse.EnrResponsePacketDataRlpReader.readFrom(EnrResponsePacketDataRlpReader.java:27)
    at org.hyperledger.besu.ethereum.p2p.discovery.internal.packet.PacketDeserializer.decode(PacketDeserializer.java:92)
    at org.hyperledger.besu.ethereum.p2p.discovery.VertxPeerDiscoveryAgent.lambda$handlePacket$9(VertxPeerDiscoveryAgent.java:331)

Proposed Fix

Add EndOfRLPException to the exception list on line 344 of VertxPeerDiscoveryAgent.java:

if (event.cause() instanceof PeerDiscoveryPacketDecodingException
    || event.cause() instanceof DecodeException
    || event.cause() instanceof org.apache.tuweni.rlp.EndOfRLPException) {
  LOG.debug(
      "Discarding invalid peer discovery packet: {}, {}",
      event.cause().getMessage(),
      event.cause());
}

Impact

Currently, malformed packets that trigger EndOfRLPException are logged as errors, which pollutes logs and can make it harder to identify actual issues. These should be treated the same as other decoding exceptions and discarded with a debug-level log.

Location

ethereum/p2p/src/main/java/org/hyperledger/besu/ethereum/p2p/discovery/VertxPeerDiscoveryAgent.java:344

Metadata

Metadata

Assignees

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions