diff options
| author | Rusty Wagner <rusty.wagner@gmail.com> | 2022-10-21 22:24:48 -0600 |
|---|---|---|
| committer | Peter LaFosse <peter@vector35.com> | 2022-11-10 16:19:13 -0500 |
| commit | 80d5547e14ca9ac0c6d6288957a454ef478bf702 (patch) | |
| tree | 592abbc8c7d5b2de528229637ec2ea4541e8b75a /rust/src | |
| parent | 5cb0dc3d392327245aaf2a0c79c2aead49ae2d02 (diff) | |
Fix ASAN crash on PDB load
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 { |
