diff --git a/ethcore/evm/src/interpreter/mod.rs b/ethcore/evm/src/interpreter/mod.rs index e99696d56f3..5621778bfab 100644 --- a/ethcore/evm/src/interpreter/mod.rs +++ b/ethcore/evm/src/interpreter/mod.rs @@ -553,7 +553,7 @@ impl Interpreter { // ignore }, instructions::BEGINSUB => { - return Err(vm::Error::OutOfGas); + return Err(vm::Error::InvalidSubEntry); }, instructions::JUMPSUB => { if self.return_stack.len() >= MAX_SUB_STACK_SIZE { diff --git a/ethcore/evm/src/tests.rs b/ethcore/evm/src/tests.rs index 035cbd4da00..448fb7ae8c9 100644 --- a/ethcore/evm/src/tests.rs +++ b/ethcore/evm/src/tests.rs @@ -943,7 +943,7 @@ fn test_subs_walk_into_subroutine(factory: super::Factory) { test_finalize(vm.exec(&mut ext).ok().unwrap()) }; - let expected = Result::Err(vm::Error::OutOfGas); + let expected = Result::Err(vm::Error::InvalidSubEntry); assert_eq!(current, expected); } diff --git a/ethcore/machine/src/executive.rs b/ethcore/machine/src/executive.rs index b1b7463e3b4..119780f6358 100644 --- a/ethcore/machine/src/executive.rs +++ b/ethcore/machine/src/executive.rs @@ -359,6 +359,7 @@ impl<'a> CallCreateExecutive<'a> { | Err(vm::Error::Reverted) | Err(vm::Error::SubStackUnderflow {..}) | Err(vm::Error::OutOfSubStack {..}) + | Err(vm::Error::InvalidSubEntry) | Ok(FinalizationResult { apply_state: false, .. }) => { if let Some(addr) = UNPRUNABLE_PRECOMPILE_ADDRESS { if un_substate.touched.contains(&addr) { diff --git a/ethcore/trace/src/types/error.rs b/ethcore/trace/src/types/error.rs index 26501167b17..7b18703f752 100644 --- a/ethcore/trace/src/types/error.rs +++ b/ethcore/trace/src/types/error.rs @@ -38,6 +38,8 @@ pub enum Error { SubStackUnderflow, /// When execution would exceed defined subroutine Stack Limit OutOfSubStack, + /// When the code walks into a subroutine, that is not allowed + InvalidSubEntry, /// When builtin contract failed on input data BuiltIn, /// Returned on evm internal error. Should never be ignored during development. @@ -61,6 +63,7 @@ impl<'a> From<&'a VmError> for Error { VmError::BadInstruction { .. } => Error::BadInstruction, VmError::StackUnderflow { .. } => Error::StackUnderflow, VmError::OutOfStack { .. } => Error::OutOfStack, + VmError::InvalidSubEntry { .. } => Error::InvalidSubEntry, VmError::BuiltIn { .. } => Error::BuiltIn, VmError::Wasm { .. } => Error::Wasm, VmError::Internal(_) => Error::Internal, @@ -88,6 +91,7 @@ impl fmt::Display for Error { BadInstruction => "Bad instruction", StackUnderflow => "Stack underflow", OutOfStack => "Out of stack", + InvalidSubEntry => "Invalid subroutine entry", BuiltIn => "Built-in failed", Wasm => "Wasm runtime error", Internal => "Internal error", @@ -118,6 +122,7 @@ impl Encodable for Error { Reverted => 10, SubStackUnderflow => 11, OutOfSubStack => 12, + InvalidSubEntry => 13, }; s.append_internal(&value); @@ -142,6 +147,7 @@ impl Decodable for Error { 10 => Ok(Reverted), 11 => Ok(SubStackUnderflow), 12 => Ok(OutOfSubStack), + 13 => Ok(InvalidSubEntry), _ => Err(DecoderError::Custom("Invalid error type")), } } diff --git a/ethcore/vm/src/error.rs b/ethcore/vm/src/error.rs index 24e4c6a69f0..40c2a3a8f38 100644 --- a/ethcore/vm/src/error.rs +++ b/ethcore/vm/src/error.rs @@ -85,6 +85,8 @@ pub enum Error { /// What was the stack limit limit: usize }, + /// When the code walks into a subroutine, that is not allowed + InvalidSubEntry, /// Built-in contract failed on given input BuiltIn(&'static str), /// When execution tries to modify the state in static context @@ -122,6 +124,7 @@ impl fmt::Display for Error { OutOfStack { instruction, wanted, limit } => write!(f, "Out of stack {} {}/{}", instruction, wanted, limit), SubStackUnderflow { wanted, on_stack } => write!(f, "Subroutine stack underflow {}/{}", wanted, on_stack), OutOfSubStack { wanted, limit } => write!(f, "Out of subroutine stack {}/{}", wanted, limit), + InvalidSubEntry => write!(f,"Invalid subroutine entry"), BuiltIn(name) => write!(f, "Built-in failed: {}", name), Internal(ref msg) => write!(f, "Internal error: {}", msg), MutableCallInStaticContext => write!(f, "Mutable call in static context"),