evm: fix premature position truncation of byte op
This commit is contained in:
parent
77135e7001
commit
28129d1df2
|
@ -229,12 +229,12 @@ const
|
|||
|
||||
byteOp: Vm2OpFn = proc(k: var Vm2Ctx) =
|
||||
## 0x20, Retrieve single byte from word.
|
||||
let (position, value) = k.cpt.stack.popInt(2)
|
||||
let pos = position.truncate(int)
|
||||
let (position, value) = k.cpt.stack.popInt(2)
|
||||
k.cpt.stack.push:
|
||||
if pos >= 32 or pos < 0:
|
||||
if position >= 32.u256:
|
||||
zero(UInt256)
|
||||
else:
|
||||
let pos = position.truncate(int)
|
||||
when system.cpuEndian == bigEndian:
|
||||
cast[array[32, byte]](value)[pos].u256
|
||||
else:
|
||||
|
|
|
@ -439,5 +439,21 @@ proc opArithMain*() =
|
|||
SIGNEXTEND
|
||||
stack: "0x000000000000000000000000000000003f9b347132d29b62d161117bca8c7307"
|
||||
|
||||
assembler:
|
||||
title: "BYTE with overflow pos 1"
|
||||
code:
|
||||
PUSH32 "0x77676767676760000000000000001002e000000000000040000000e000000000"
|
||||
PUSH32 "0x0000000000000000000000000000000000000000000000010000000000000000"
|
||||
BYTE
|
||||
stack: "0x0000000000000000000000000000000000000000000000000000000000000000"
|
||||
|
||||
assembler:
|
||||
title: "BYTE with overflow pos 2"
|
||||
code:
|
||||
PUSH32 "0x001f000000000000000000000000000000200000000100000000000000000000"
|
||||
PUSH32 "0x0000000000000000000000000000000080000000000000000000000000000001"
|
||||
BYTE
|
||||
stack: "0x0000000000000000000000000000000000000000000000000000000000000000"
|
||||
|
||||
when isMainModule:
|
||||
opArithMain()
|
||||
|
|
Loading…
Reference in New Issue