Skip to content

Commit aa09128

Browse files
committed
fixes
1 parent c55535d commit aa09128

File tree

6 files changed

+24
-55
lines changed

6 files changed

+24
-55
lines changed

substrate/frame/revive/src/vm/evm.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,6 @@ fn run_plain<E: Ext>(interpreter: &mut Interpreter<E>) -> ControlFlow<Halt, Infa
138138
loop {
139139
let opcode = interpreter.bytecode.opcode();
140140
interpreter.bytecode.relative_jump(1);
141-
exec_instruction(opcode, interpreter)?;
141+
exec_instruction(interpreter, opcode)?;
142142
}
143143
}

substrate/frame/revive/src/vm/evm/instructions/bitwise.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717

1818
mod bits;
1919

20-
use super::arithmetic::i256::i256_cmp;
20+
use super::{arithmetic::i256::i256_cmp, utility::as_usize_saturated};
2121
use crate::{
2222
vm::{
2323
evm::{interpreter::Halt, EVMGas, Interpreter},
@@ -162,7 +162,7 @@ pub fn shl<E: Ext>(interpreter: &mut Interpreter<E>) -> ControlFlow<Halt> {
162162
interpreter.ext.charge_or_halt(EVMGas(VERYLOW))?;
163163
let ([op1], op2) = interpreter.stack.popn_top()?;
164164

165-
let shift = as_usize_saturated!(op1);
165+
let shift = as_usize_saturated(op1);
166166
*op2 = if shift < 256 { *op2 << shift } else { U256::zero() };
167167
ControlFlow::Continue(())
168168
}
@@ -172,7 +172,7 @@ pub fn shr<E: Ext>(interpreter: &mut Interpreter<E>) -> ControlFlow<Halt> {
172172
interpreter.ext.charge_or_halt(EVMGas(VERYLOW))?;
173173
let ([op1], op2) = interpreter.stack.popn_top()?;
174174

175-
let shift = as_usize_saturated!(op1);
175+
let shift = as_usize_saturated(op1);
176176
*op2 = if shift < 256 { *op2 >> shift } else { U256::zero() };
177177
ControlFlow::Continue(())
178178
}
@@ -182,7 +182,7 @@ pub fn sar<E: Ext>(interpreter: &mut Interpreter<E>) -> ControlFlow<Halt> {
182182
interpreter.ext.charge_or_halt(EVMGas(VERYLOW))?;
183183
let ([op1], op2) = interpreter.stack.popn_top()?;
184184

185-
let shift = as_usize_saturated!(op1);
185+
let shift = as_usize_saturated(op1);
186186
*op2 = if shift < 256 {
187187
op2.arithmetic_shr(shift)
188188
} else if op2.bit(255) {

substrate/frame/revive/src/vm/evm/instructions/macros.rs

Lines changed: 0 additions & 41 deletions
This file was deleted.

substrate/frame/revive/src/vm/evm/instructions/mod.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,8 @@
1919
2020
use super::interpreter::Interpreter;
2121
use crate::vm::{evm::Halt, Ext};
22+
use revm::bytecode::opcode::*;
2223

23-
#[macro_use]
24-
mod macros;
2524
/// Arithmetic operations (ADD, SUB, MUL, DIV, etc.).
2625
mod arithmetic;
2726
/// Bitwise operations (AND, OR, XOR, NOT, etc.).
@@ -49,11 +48,9 @@ mod tx_info;
4948
mod utility;
5049

5150
pub fn exec_instruction<E: Ext>(
52-
opcode: u8,
5351
interpreter: &mut Interpreter<E>,
52+
opcode: u8,
5453
) -> core::ops::ControlFlow<Halt> {
55-
use revm::bytecode::opcode::*;
56-
5754
match opcode {
5855
STOP => control::stop(interpreter),
5956
ADD => arithmetic::add(interpreter),

substrate/frame/revive/src/vm/evm/instructions/system.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ use crate::{
2323
},
2424
Config, U256,
2525
};
26+
use super::utility::as_usize_saturated;
2627
use core::{ops::ControlFlow, ptr};
2728
use revm::interpreter::gas::{BASE, VERYLOW};
2829
use sp_core::H256;
@@ -95,7 +96,7 @@ pub fn codecopy<E: Ext>(interpreter: &mut Interpreter<E>) -> ControlFlow<Halt> {
9596
let Some(memory_offset) = memory_resize(interpreter, memory_offset, len)? else {
9697
return ControlFlow::Continue(())
9798
};
98-
let code_offset = as_usize_saturated!(code_offset);
99+
let code_offset = as_usize_saturated(code_offset);
99100

100101
interpreter.memory.set_data(
101102
memory_offset,
@@ -113,7 +114,7 @@ pub fn calldataload<E: Ext>(interpreter: &mut Interpreter<E>) -> ControlFlow<Hal
113114
interpreter.ext.charge_or_halt(EVMGas(VERYLOW))?;
114115
let ([], offset_ptr) = interpreter.stack.popn_top()?;
115116
let mut word = [0u8; 32];
116-
let offset = as_usize_saturated!(offset_ptr);
117+
let offset = as_usize_saturated(*offset_ptr);
117118
let input = &interpreter.input;
118119
let input_len = input.len();
119120
if offset < input_len {
@@ -153,7 +154,7 @@ pub fn calldatacopy<E: Ext>(interpreter: &mut Interpreter<E>) -> ControlFlow<Hal
153154
return ControlFlow::Continue(());
154155
};
155156

156-
let data_offset = as_usize_saturated!(data_offset);
157+
let data_offset = as_usize_saturated(data_offset);
157158
interpreter.memory.set_data(memory_offset, data_offset, len, &interpreter.input);
158159
ControlFlow::Continue(())
159160
}
@@ -170,7 +171,7 @@ pub fn returndatacopy<E: Ext>(interpreter: &mut Interpreter<E>) -> ControlFlow<H
170171
let [memory_offset, offset, len] = interpreter.stack.popn()?;
171172

172173
let len = as_usize_or_halt(len)?;
173-
let data_offset = as_usize_saturated!(offset);
174+
let data_offset = as_usize_saturated(offset);
174175

175176
// Old legacy behavior is to panic if data_end is out of scope of return buffer.
176177
let data_end = data_offset.saturating_add(len);

substrate/frame/revive/src/vm/evm/instructions/utility.rs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,18 @@
1717

1818
use sp_core::{H160, U256};
1919

20+
/// Converts a `U256` value to a `usize`, saturating to `MAX` if the value is too large.
21+
pub fn as_usize_saturated(v: U256) -> usize {
22+
match &v.0 {
23+
x =>
24+
if (x[1] == 0) & (x[2] == 0) & (x[3] == 0) {
25+
usize::try_from(x[0]).unwrap_or(usize::MAX)
26+
} else {
27+
usize::MAX
28+
},
29+
}
30+
}
31+
2032
/// Pushes an arbitrary length slice of bytes onto the stack, padding the last word with zeros
2133
/// if necessary.
2234
///

0 commit comments

Comments
 (0)