From 4ee92f2d193225e70c190194d005a6ce80e70236 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= Date: Wed, 23 Aug 2017 10:41:12 +0300 Subject: [PATCH] core/types: reject Metro receipts with > 0x01 status bytes --- core/types/receipt.go | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/core/types/receipt.go b/core/types/receipt.go index 9c49648b43..b54bd7b4f9 100644 --- a/core/types/receipt.go +++ b/core/types/receipt.go @@ -108,14 +108,21 @@ func (r *Receipt) DecodeRLP(s *rlp.Stream) error { } // Deserialize based on the first component type. switch { - case kind == rlp.Byte || kind == rlp.String && len(cnt) == 0: - // The first component of metropolis receipts is Byte - // or empty String(byte with 0x00 value). + case kind == rlp.Byte || (kind == rlp.String && len(cnt) == 0): + // The first component of metropolis receipts is Byte (0x01), or the empty + // string (0x80, decoded as a byte with 0x00 value). var metro metropolisReceiptRLP if err := rlp.DecodeBytes(raw, &metro); err != nil { return err } - r.Failed = metro.Status == receiptStatusFailed + switch metro.Status { + case receiptStatusSuccessful: + r.Failed = false + case receiptStatusFailed: + r.Failed = true + default: + return fmt.Errorf("invalid status byte: 0x%x", metro.Status) + } r.CumulativeGasUsed = metro.CumulativeGasUsed r.Bloom = metro.Bloom r.Logs = metro.Logs