Merge branch 'master' into kvdb_split

This commit is contained in:
debris 2017-10-13 16:27:12 +02:00
commit b277c3810f
6 changed files with 61 additions and 25 deletions

2
Cargo.lock generated
View File

@ -1207,8 +1207,8 @@ dependencies = [
name = "hash" name = "hash"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"cc 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
"ethcore-bigint 0.1.3", "ethcore-bigint 0.1.3",
"gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)",
"tempdir 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", "tempdir 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
"tiny-keccak 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", "tiny-keccak 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
] ]

View File

@ -123,7 +123,11 @@ impl Pricer for ModexpPricer {
let adjusted_exp_len = Self::adjusted_exp_len(exp_len, exp_low); let adjusted_exp_len = Self::adjusted_exp_len(exp_len, exp_low);
(Self::mult_complexity(m) * max(adjusted_exp_len, 1) / self.divisor as u64).into() let (gas, overflow) = Self::mult_complexity(m).overflowing_mul(max(adjusted_exp_len, 1));
if overflow {
return U256::max_value();
}
(gas / self.divisor as u64).into()
} }
} }
@ -706,6 +710,14 @@ mod tests {
activate_at: 0, activate_at: 0,
}; };
// test for potential gas cost multiplication overflow
{
let input = FromHex::from_hex("0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000003b27bafd00000000000000000000000000000000000000000000000000000000503c8ac3").unwrap();
let expected_cost = U256::max_value();
assert_eq!(f.cost(&input[..]), expected_cost.into());
}
// test for potential exp len overflow // test for potential exp len overflow
{ {
let input = FromHex::from_hex("\ let input = FromHex::from_hex("\

View File

@ -1203,6 +1203,16 @@ mod tests {
use toml; use toml;
use clap::{ErrorKind as ClapErrorKind}; use clap::{ErrorKind as ClapErrorKind};
#[test]
fn should_reject_invalid_values() {
let args = Args::parse(&["parity", "--cache=20"]);
assert!(args.is_ok());
let args = Args::parse(&["parity", "--cache=asd"]);
assert!(args.is_err());
}
#[test] #[test]
fn should_parse_args_and_flags() { fn should_parse_args_and_flags() {
let args = Args::parse(&["parity", "--no-warp"]).unwrap(); let args = Args::parse(&["parity", "--no-warp"]).unwrap();

View File

@ -32,6 +32,20 @@ macro_rules! otry {
) )
} }
macro_rules! return_if_parse_error {
($e:expr) => (
match $e {
Err(clap_error @ ClapError { kind: ClapErrorKind::ValueValidation, .. }) => {
return Err(clap_error);
},
// Otherwise, if $e is ClapErrorKind::ArgumentNotFound or Ok(),
// then convert to Option
_ => $e.ok()
}
)
}
macro_rules! if_option { macro_rules! if_option {
(Option<$type:ty>, THEN {$($then:tt)*} ELSE {$($otherwise:tt)*}) => ( (Option<$type:ty>, THEN {$($then:tt)*} ELSE {$($otherwise:tt)*}) => (
$($then)* $($then)*
@ -139,7 +153,7 @@ macro_rules! usage {
use std::{fs, io, process}; use std::{fs, io, process};
use std::io::{Read, Write}; use std::io::{Read, Write};
use util::version; use util::version;
use clap::{Arg, App, SubCommand, AppSettings, Error as ClapError}; use clap::{Arg, App, SubCommand, AppSettings, Error as ClapError, ErrorKind as ClapErrorKind};
use helpers::replace_home; use helpers::replace_home;
use std::ffi::OsStr; use std::ffi::OsStr;
use std::collections::HashMap; use std::collections::HashMap;
@ -563,23 +577,23 @@ macro_rules! usage {
raw_args.$flag = matches.is_present(stringify!($flag)); raw_args.$flag = matches.is_present(stringify!($flag));
)* )*
$( $(
raw_args.$arg = if_option!( raw_args.$arg = return_if_parse_error!(if_option!(
$($arg_type_tt)+, $($arg_type_tt)+,
THEN { THEN {
if_option_vec!( if_option_vec!(
$($arg_type_tt)+, $($arg_type_tt)+,
THEN { values_t!(matches, stringify!($arg), inner_option_vec_type!($($arg_type_tt)+)).ok() } THEN { values_t!(matches, stringify!($arg), inner_option_vec_type!($($arg_type_tt)+)) }
ELSE { value_t!(matches, stringify!($arg), inner_option_type!($($arg_type_tt)+)).ok() } ELSE { value_t!(matches, stringify!($arg), inner_option_type!($($arg_type_tt)+)) }
) )
} }
ELSE { ELSE {
if_vec!( if_vec!(
$($arg_type_tt)+, $($arg_type_tt)+,
THEN { values_t!(matches, stringify!($arg), inner_vec_type!($($arg_type_tt)+)).ok() } THEN { values_t!(matches, stringify!($arg), inner_vec_type!($($arg_type_tt)+)) }
ELSE { value_t!(matches, stringify!($arg), $($arg_type_tt)+).ok() } ELSE { value_t!(matches, stringify!($arg), $($arg_type_tt)+) }
) )
} }
); ));
)* )*
)* )*
@ -594,23 +608,23 @@ macro_rules! usage {
)* )*
// Subcommand arguments // Subcommand arguments
$( $(
raw_args.$subc_arg = if_option!( raw_args.$subc_arg = return_if_parse_error!(if_option!(
$($subc_arg_type_tt)+, $($subc_arg_type_tt)+,
THEN { THEN {
if_option_vec!( if_option_vec!(
$($subc_arg_type_tt)+, $($subc_arg_type_tt)+,
THEN { values_t!(submatches, stringify!($subc_arg), inner_option_vec_type!($($subc_arg_type_tt)+)).ok() } THEN { values_t!(submatches, stringify!($subc_arg), inner_option_vec_type!($($subc_arg_type_tt)+)) }
ELSE { value_t!(submatches, stringify!($subc_arg), inner_option_type!($($subc_arg_type_tt)+)).ok() } ELSE { value_t!(submatches, stringify!($subc_arg), inner_option_type!($($subc_arg_type_tt)+)) }
) )
} }
ELSE { ELSE {
if_vec!( if_vec!(
$($subc_arg_type_tt)+, $($subc_arg_type_tt)+,
THEN { values_t!(submatches, stringify!($subc_arg), inner_vec_type!($($subc_arg_type_tt)+)).ok() } THEN { values_t!(submatches, stringify!($subc_arg), inner_vec_type!($($subc_arg_type_tt)+)) }
ELSE { value_t!(submatches, stringify!($subc_arg), $($subc_arg_type_tt)+).ok() } ELSE { value_t!(submatches, stringify!($subc_arg), $($subc_arg_type_tt)+) }
) )
} }
); ));
)* )*
// Sub-subcommands // Sub-subcommands
@ -624,23 +638,23 @@ macro_rules! usage {
)* )*
// Sub-subcommand arguments // Sub-subcommand arguments
$( $(
raw_args.$subc_subc_arg = if_option!( raw_args.$subc_subc_arg = return_if_parse_error!(if_option!(
$($subc_subc_arg_type_tt)+, $($subc_subc_arg_type_tt)+,
THEN { THEN {
if_option_vec!( if_option_vec!(
$($subc_subc_arg_type_tt)+, $($subc_subc_arg_type_tt)+,
THEN { values_t!(subsubmatches, stringify!($subc_subc_arg), inner_option_vec_type!($($subc_subc_arg_type_tt)+)).ok() } THEN { values_t!(subsubmatches, stringify!($subc_subc_arg), inner_option_vec_type!($($subc_subc_arg_type_tt)+)) }
ELSE { value_t!(subsubmatches, stringify!($subc_subc_arg), inner_option_type!($($subc_subc_arg_type_tt)+)).ok() } ELSE { value_t!(subsubmatches, stringify!($subc_subc_arg), inner_option_type!($($subc_subc_arg_type_tt)+)) }
) )
} }
ELSE { ELSE {
if_vec!( if_vec!(
$($subc_subc_arg_type_tt)+, $($subc_subc_arg_type_tt)+,
THEN { values_t!(subsubmatches, stringify!($subc_subc_arg), inner_vec_type!($($subc_subc_arg_type_tt)+)).ok() } THEN { values_t!(subsubmatches, stringify!($subc_subc_arg), inner_vec_type!($($subc_subc_arg_type_tt)+)) }
ELSE { value_t!(subsubmatches, stringify!($subc_subc_arg), $($subc_subc_arg_type_tt)+).ok() } ELSE { value_t!(subsubmatches, stringify!($subc_subc_arg), $($subc_subc_arg_type_tt)+) }
) )
} }
); ));
)* )*
} }
else { else {

View File

@ -12,7 +12,7 @@ ethcore-bigint = { path = "../bigint" }
tiny-keccak = "1.3" tiny-keccak = "1.3"
[build-dependencies] [build-dependencies]
gcc = "0.3" cc = "1.0"
[dev-dependencies] [dev-dependencies]
tempdir = "0.3" tempdir = "0.3"

View File

@ -16,11 +16,11 @@
// build.rs // build.rs
// Bring in a dependency on an externally maintained `gcc` package which manages // Bring in a dependency on an externally maintained `cc` package which manages
// invoking the C compiler. // invoking the C compiler.
extern crate gcc; extern crate cc;
fn main() { fn main() {
gcc::Build::new().file("src/tinykeccak.c").compile("libtinykeccak.a"); cc::Build::new().file("src/tinykeccak.c").compile("libtinykeccak.a");
} }