Skip to content

Commit a4e272a

Browse files
authored
chore(cast): avoid panic when decoding constructor args and add bounds check (#11700)
1 parent 55bcdab commit a4e272a

File tree

1 file changed

+11
-5
lines changed

1 file changed

+11
-5
lines changed

crates/cast/src/cmd/constructor_args.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -74,21 +74,27 @@ async fn parse_constructor_args(
7474
}
7575

7676
let args_size = constructor.inputs.len() * 32;
77+
if bytecode.len() < args_size {
78+
return Err(eyre!(
79+
"Invalid creation bytecode length: have {} bytes, need at least {} for {} constructor inputs",
80+
bytecode.len(),
81+
args_size,
82+
constructor.inputs.len()
83+
));
84+
}
7785
let args_bytes = Bytes::from(bytecode[bytecode.len() - args_size..].to_vec());
7886

7987
let display_args: Vec<String> = args_bytes
8088
.chunks(32)
8189
.enumerate()
82-
.map(|(i, arg)| {
83-
format_arg(&constructor.inputs[i].ty, arg).expect("Failed to format argument.")
84-
})
85-
.collect();
90+
.map(|(i, arg)| format_arg(&constructor.inputs[i].ty, arg))
91+
.collect::<Result<Vec<_>>>()?;
8692

8793
Ok(display_args)
8894
}
8995

9096
fn format_arg(ty: &str, arg: &[u8]) -> Result<String> {
91-
let arg_type: DynSolType = ty.parse().expect("Invalid ABI type.");
97+
let arg_type: DynSolType = ty.parse()?;
9298
let decoded = arg_type.abi_decode(arg)?;
9399
let bytes = Bytes::from(arg.to_vec());
94100

0 commit comments

Comments
 (0)