From c8c0879f3dfedb37ff5b364ca9b96d2b6b708517 Mon Sep 17 00:00:00 2001 From: Gav Date: Mon, 29 Jan 2018 17:19:56 +0100 Subject: [PATCH] Correct implementation of `memcmp` --- substrate/Cargo.lock | 8 +------- substrate/executor/Cargo.toml | 2 +- substrate/executor/src/error.rs | 6 ++++++ substrate/executor/src/lib.rs | 2 +- substrate/executor/src/wasm_executor.rs | 12 ++++++++---- substrate/wasm-runtime/pwasm-libc/src/lib.rs | 2 +- .../release/runtime_polkadot.compact.wasm | Bin 64054 -> 64085 bytes .../release/runtime_polkadot.wasm | Bin 64103 -> 64134 bytes .../release/runtime_test.compact.wasm | Bin 13189 -> 13189 bytes .../release/runtime_test.wasm | Bin 13314 -> 13314 bytes 10 files changed, 18 insertions(+), 14 deletions(-) diff --git a/substrate/Cargo.lock b/substrate/Cargo.lock index 6d5f20ecdf..c741c845a5 100644 --- a/substrate/Cargo.lock +++ b/substrate/Cargo.lock @@ -498,11 +498,6 @@ dependencies = [ "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", ] -[[package]] -name = "memcmp" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "memorydb" version = "0.1.1" @@ -731,7 +726,7 @@ dependencies = [ "assert_matches 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "byteorder 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memcmp 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", "native-runtime 0.1.0", "parity-wasm 0.15.4 (registry+https://github.com/rust-lang/crates.io-index)", "polkadot-primitives 0.1.0", @@ -1339,7 +1334,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum libc 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "5ba3df4dcb460b9dfbd070d41c94c19209620c191b0340b929ce748a2bcd42d2" "checksum log 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)" = "880f77541efa6e5cc74e76910c9884d9859683118839d6a1dc3b11e63512565b" "checksum memchr 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "148fab2e51b4f1cfc66da2a7c32981d1d3c083a803978268bb11fe4b86925e7a" -"checksum memcmp 0.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "9a1b44fee357b6a05a9e22554ded6c1bbe57844b58190295257ac0ad4c5944e1" "checksum memorydb 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "013b7e4c5e10c764936ebc6bd3662d8e3c92292d267bf6a42ef3f5cad9c793ee" "checksum mime 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e2e00e17be181010a91dbfefb01660b17311059dc8c7f48b9017677721e732bd" "checksum mio 0.6.11 (registry+https://github.com/rust-lang/crates.io-index)" = "0e8411968194c7b139e9105bc4ae7db0bae232af087147e72f0616ebf5fdb9cb" diff --git a/substrate/executor/Cargo.toml b/substrate/executor/Cargo.toml index 498482c03f..5329eb7023 100644 --- a/substrate/executor/Cargo.toml +++ b/substrate/executor/Cargo.toml @@ -15,7 +15,7 @@ byteorder = "1.1" rustc-hex = "1.0.0" native-runtime = { path = "../native-runtime", version = "0.1" } runtime-std = { path = "../native-runtime/std", version = "0.1" } -memcmp = { version = "0.0.6" } +libc = { version = "0.2.33" } [dev-dependencies] assert_matches = "1.1" diff --git a/substrate/executor/src/error.rs b/substrate/executor/src/error.rs index c1f9c2c711..973fa58d38 100644 --- a/substrate/executor/src/error.rs +++ b/substrate/executor/src/error.rs @@ -59,5 +59,11 @@ error_chain! { description("runtime failure"), display("Runtime error"), } + + /// Runtime failed. + InvalidMemoryReference { + description("invalid memory reference"), + display("Invalid memory reference"), + } } } diff --git a/substrate/executor/src/lib.rs b/substrate/executor/src/lib.rs index cfb0506352..9935f8aec8 100644 --- a/substrate/executor/src/lib.rs +++ b/substrate/executor/src/lib.rs @@ -36,7 +36,7 @@ extern crate byteorder; extern crate rustc_hex; extern crate native_runtime; extern crate runtime_std; -extern crate memcmp; +extern crate libc; #[macro_use] extern crate error_chain; diff --git a/substrate/executor/src/wasm_executor.rs b/substrate/executor/src/wasm_executor.rs index c184abab89..a4b1b453c2 100644 --- a/substrate/executor/src/wasm_executor.rs +++ b/substrate/executor/src/wasm_executor.rs @@ -16,10 +16,11 @@ //! Rust implementation of Polkadot contracts. +use libc::{memcmp, c_void}; use std::sync::Arc; use std::collections::HashMap; use parity_wasm::{deserialize_buffer, ModuleInstanceInterface, ProgramInstance}; -use parity_wasm::interpreter::{ItemIndex}; +use parity_wasm::interpreter::{ItemIndex, DummyUserError}; use parity_wasm::RuntimeValue::{I32, I64}; use primitives::contract::CallData; use state_machine::{Externalities, CodeExecutor}; @@ -96,10 +97,13 @@ impl_function_executor!(this: FunctionExecutor<'e, E>, ext_memcmp(s1: *const u8, s2: *const u8, n: usize) -> i32 => { if let (Ok(sl1), Ok(sl2)) = (this.memory.get(s1, n as usize), this.memory.get(s2, n as usize)) { - use memcmp::Memcmp; - (&sl1).memcmp(&sl2) as i32 + unsafe { + memcmp(sl1.as_ptr() as *const u8 as *const c_void, + sl2.as_ptr() as *const u8 as *const c_void, + n as usize) as i32 + } } else { - 0 + return Err(DummyUserError.into()); } }, ext_memcpy(dest: *mut u8, src: *const u8, count: usize) -> *mut u8 => { diff --git a/substrate/wasm-runtime/pwasm-libc/src/lib.rs b/substrate/wasm-runtime/pwasm-libc/src/lib.rs index 0c2fd43fc6..f4e5eb7a57 100644 --- a/substrate/wasm-runtime/pwasm-libc/src/lib.rs +++ b/substrate/wasm-runtime/pwasm-libc/src/lib.rs @@ -22,7 +22,7 @@ pub unsafe extern "C" fn memcpy(dest: *mut u8, src: *const u8, n: usize) -> *mut ext_memcpy(dest, src, n) } -/// memcpy extern +/// memcmp extern #[no_mangle] pub unsafe extern "C" fn memcmp(s1: *const u8, s2: *const u8, n: usize) -> i32 { ext_memcmp(s1, s2, n) diff --git a/substrate/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_polkadot.compact.wasm b/substrate/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_polkadot.compact.wasm index c65945f6213a7648c8f2af485fad014d2f5c2d0f..db7dab9917d324f143aea0837c0fdf2ee30504bc 100644 GIT binary patch delta 9546 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 VBHLRhXZdQ{u)V)@#oP0>{{mWUVU+*? diff --git a/substrate/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm b/substrate/wasm-runtime/target/wasm32-unknown-unknown/release/runtime_test.compact.wasm index b7de494d797ad705fdd131f73372496980b4f089..63e7666aadfbfdef2c4286d3397788e339381d7b 100644 GIT binary patch delta 158 zcmZooZ%yBj&%$&-YH}e<3yAv8(g&nAx3g+8f#^-_ZbFO?Hvg2&U}ZcoIZ0j>q^48; z7l>+Ahy*Elpsq^48; z7l>+Ahy*ElpsZvJ;ALPCWME(@0Mf!h r`VX)Z}+8Eg-6dwGT*bW?|E00@3;$ZbFO?HkV0dureN)d|zG_q=rr5 z7l>j~j07o(Rb0vl;>Id&n!HW<6G&*4%1lPa1)E*eigw6GB7YS0BK<$ zeTs>JffGnGI6jc#7EDeoNKDQwsZ_`>OD#&v$uDPcY>?&_&dE$l%*n}5)-Osdk1tD2 I)+;Io0K!!^@&Et; delta 175 zcmZq5Xv)~|hJ|T@^yGIeEg-6dwGT*bW?|E00@3;$ZbFO~HkV0durh9$d|zG_q=rr5 z7l>j~j07o(Rb0vl;>Id&n!HW<6G&*4%1lPa37cKiigw6GB7X{0BK<$ zeTs>JffGnGI9`zA7EDeoNKDQwsZ_`>OD#&v$uDPc{2;|GoRgW9n3I#AtY4H^9$%K4 ItXEVF0MgJkQUCw|