diff options
Diffstat (limited to 'rust/src')
| -rw-r--r-- | rust/src/callingconvention.rs | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/rust/src/callingconvention.rs b/rust/src/callingconvention.rs index a8deadef..c1ac22ec 100644 --- a/rust/src/callingconvention.rs +++ b/rust/src/callingconvention.rs @@ -452,9 +452,12 @@ impl<A: Architecture> CallingConvention<A> { int_arg_registers: Option<Vec<A::Register>>, ) -> Vec<Variable> { let mut bn_params: Vec<BNFunctionParameter> = vec![]; + let mut name_strings = vec![]; for parameter in params.iter() { - let raw_name = parameter.name.clone().into_bytes_with_nul(); + name_strings.push(parameter.name.clone().into_bytes_with_nul()); + } + for (parameter, raw_name) in params.iter().zip(name_strings.iter_mut()) { let location = match ¶meter.location { Some(location) => location.into_raw(), None => unsafe { mem::zeroed() }, @@ -496,6 +499,9 @@ impl<A: Architecture> CallingConvention<A> { } }; + // Gotta keep this around so the pointers are valid during the call + drop(name_strings); + let vars_slice = unsafe { slice::from_raw_parts(vars, count) }; let mut result = vec![]; for var in vars_slice { |
