Skip to content

Commit

Permalink
bug: Integer overflow while calculating the remaining gas in GasInspe…
Browse files Browse the repository at this point in the history
…ctor (#287)
  • Loading branch information
rakita committed Dec 7, 2022
1 parent acdbaac commit 54e0333
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 6 deletions.
3 changes: 1 addition & 2 deletions bins/revme/src/statetest/runner.rs
Expand Up @@ -277,8 +277,7 @@ pub fn execute_test_suit(path: &Path, elapsed: &Arc<Mutex<Duration>>) -> Result<
let db = evm.db().unwrap();
println!("{path:?} UNIT_TEST:{name}\n");
println!(
"failed reason: {:?} {:?} UNIT_TEST:{}\n gas:{:?} ({:?} refunded)",
exit_reason, path, name, gas_used, gas_refunded,
"failed reason: {exit_reason:?} {path:?} UNIT_TEST:{name}\n gas:{gas_used:?} ({gas_refunded:?} refunded)"
);
println!("\nApplied state:{db:?}\n");
println!("\nStateroot: {state_root:?}\n");
Expand Down
34 changes: 33 additions & 1 deletion bins/revme/src/statetest/trace.rs
Expand Up @@ -49,7 +49,7 @@ impl<DB: Database> Inspector<DB> for CustomPrintTracer {
interp.program_counter(),
gas_remaining,
gas_remaining,
opcode_str.unwrap(),
opcode_str.unwrap_or("UNKNOWN"),
opcode,
interp.gas.refunded(),
interp.gas.refunded(),
Expand Down Expand Up @@ -139,3 +139,35 @@ impl<DB: Database> Inspector<DB> for CustomPrintTracer {
println!("SELFDESTRUCT on "); //{:?} target: {:?}", address, target);
}
}

#[cfg(test)]
mod test {

use super::*;
use hex_literal::hex;
use revm::{common::keccak256, Bytecode, TransactTo, U256};

#[test]
fn gas_calculation_underflow() {
// https://github.com/bluealloy/revm/issues/277
// checks this usecase
let mut evm = revm::new();
let mut database = revm::InMemoryDB::default();
let code: Bytes = hex::decode("5b597fb075978b6c412c64d169d56d839a8fe01b3f4607ed603b2c78917ce8be1430fe6101e8527ffe64706ecad72a2f5c97a95e006e279dc57081902029ce96af7edae5de116fec610208527f9fc1ef09d4dd80683858ae3ea18869fe789ddc365d8d9d800e26c9872bac5e5b6102285260276102485360d461024953601661024a53600e61024b53607d61024c53600961024d53600b61024e5360b761024f5360596102505360796102515360a061025253607261025353603a6102545360fb61025553601261025653602861025753600761025853606f61025953601761025a53606161025b53606061025c5360a661025d53602b61025e53608961025f53607a61026053606461026153608c6102625360806102635360d56102645360826102655360ae61026653607f6101e8610146610220677a814b184591c555735fdcca53617f4d2b9134b29090c87d01058e27e962047654f259595947443b1b816b65cdb6277f4b59c10a36f4e7b8658f5a5e6f5561").unwrap().into();

let acc_info = revm::AccountInfo {
balance: "0x100c5d668240db8e00".parse().unwrap(),
code_hash: keccak256(&code),
code: Some(Bytecode::new_raw(code.clone())),
nonce: "1".parse().unwrap(),
};
let callee = hex!("5fdcca53617f4d2b9134b29090c87d01058e27e9");
database.insert_account_info(B160(callee), acc_info);
evm.database(database);
evm.env.tx.caller = B160(hex!("5fdcca53617f4d2b9134b29090c87d01058e27e0"));
evm.env.tx.transact_to = TransactTo::Call(B160(callee));
evm.env.tx.data = Bytes::from(hex::decode("").unwrap());
evm.env.tx.value = U256::ZERO;
evm.inspect_commit(CustomPrintTracer::new());
}
}
2 changes: 1 addition & 1 deletion crates/revm/src/bits.rs
Expand Up @@ -148,7 +148,7 @@ mod serialize {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
match *self {
Self::InvalidHex { character, index } => {
write!(fmt, "invalid hex character: {}, at {}", character, index)
write!(fmt, "invalid hex character: {character}, at {index}")
}
}
}
Expand Down
5 changes: 3 additions & 2 deletions crates/revm/src/inspector.rs
Expand Up @@ -202,11 +202,12 @@ impl<DB: Database> Inspector<DB> for GasInspector {
} else if self.was_return {
// we are ok to decrement PC by one as it is return of call
let previous_pc = pc - 1;
self.reduced_gas_block = 0;
self.full_gas_block = interp.contract.gas_block(previous_pc);
self.was_return = false;
}

self.gas_remaining = interp.gas.remaining() + self.full_gas_block - self.reduced_gas_block;
self.gas_remaining =
interp.gas.remaining() + (self.full_gas_block - self.reduced_gas_block);

Return::Continue
}
Expand Down

0 comments on commit 54e0333

Please sign in to comment.