Skip to content

core/types: reset Log.Removed in Receipt.DeriveFields#35165

Open
cuiweixie wants to merge 1 commit into
ethereum:masterfrom
cuiweixie:harden-derivefields-reset-removed
Open

core/types: reset Log.Removed in Receipt.DeriveFields#35165
cuiweixie wants to merge 1 commit into
ethereum:masterfrom
cuiweixie:harden-derivefields-reset-removed

Conversation

@cuiweixie

Copy link
Copy Markdown
Contributor

DeriveFields rewrites every canonical inclusion field on each log (BlockNumber, BlockHash, BlockTimestamp, TxHash, TxIndex, Index) but left the transient Removed flag untouched. A canonically-included log is by definition not removed, so derivation should drive Removed back to false just like the other derived fields.

This is a defensive consistency fix rather than a fix for a presently reachable bug. The only place Removed is set to true is collectReceiptsAndLogs, which operates on fresh receipts read via ReadRawReceipts (Removed is rlp:"-", so always decoded as false), derives fields before flagging removal, and discards those objects after emitting the reorg event. They are never cached or re-derived, and the cached receipts are separate instances, so no Removed==true log currently reaches DeriveFields. Resetting the flag here hardens the function against a reused/stale log object regardless of the calling path.

DeriveFields rewrites every canonical inclusion field on each log
(BlockNumber, BlockHash, BlockTimestamp, TxHash, TxIndex, Index) but left
the transient Removed flag untouched. A canonically-included log is by
definition not removed, so derivation should drive Removed back to false
just like the other derived fields.

This is a defensive consistency fix rather than a fix for a presently
reachable bug. The only place Removed is set to true is
collectReceiptsAndLogs, which operates on fresh receipts read via
ReadRawReceipts (Removed is rlp:"-", so always decoded as false), derives
fields before flagging removal, and discards those objects after emitting
the reorg event. They are never cached or re-derived, and the cached
receipts are separate instances, so no Removed==true log currently reaches
DeriveFields. Resetting the flag here hardens the function against a
reused/stale log object regardless of the calling path.
@cuiweixie cuiweixie requested a review from rjl493456442 as a code owner June 13, 2026 10:49
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