diff --git a/rust/src/metadata.rs b/rust/src/metadata.rs index b6a88eef4..8321564fb 100644 --- a/rust/src/metadata.rs +++ b/rust/src/metadata.rs @@ -2,6 +2,7 @@ use crate::rc::{Array, CoreArrayProvider, CoreArrayProviderInner, Guard, Ref, Re use crate::string::{raw_to_string, BnString, IntoCStr, IntoJson}; use binaryninjacore_sys::*; use std::collections::HashMap; +use std::ffi::CStr; use std::fmt::{Debug, Display, Formatter}; use std::os::raw::c_char; use std::slice; @@ -158,7 +159,7 @@ impl Metadata { let list = unsafe { slice::from_raw_parts(ptr, size) }; let vec = list .iter() - .map(|ptr| unsafe { BnString::from_raw(*ptr) }) + .map(|ptr| BnString::new(unsafe { CStr::from_ptr(*ptr) })) .collect::>(); unsafe { BNFreeMetadataStringList(ptr, size) }; Some(vec) diff --git a/rust/tests/metadata.rs b/rust/tests/metadata.rs index 6b67c5e05..45328a325 100644 --- a/rust/tests/metadata.rs +++ b/rust/tests/metadata.rs @@ -27,6 +27,17 @@ fn basic_metadata() { let metadata_4: Ref = From::from(&vec![1.55f64, 2.55f64]); assert_eq!(metadata_4.get_type(), MetadataType::ArrayDataType); assert_eq!(metadata_4.get_double_list(), Some(vec![1.55f64, 2.55f64])); + + let metadata_5: Ref = From::from(vec!["one", "two"]); + assert_eq!(metadata_5.get_type(), MetadataType::ArrayDataType); + let strings = metadata_5 + .get_string_list() + .expect("Expected a string list"); + let strings: Vec<_> = strings + .iter() + .map(|s| s.to_string_lossy().into_owned()) + .collect(); + assert_eq!(strings, vec!["one", "two"]); } #[test]