summaryrefslogtreecommitdiff
path: root/rust
diff options
context:
space:
mode:
authorMason Reed <mason@vector35.com>2026-02-05 12:04:29 -0800
committerMason Reed <35282038+emesare@users.noreply.github.com>2026-02-23 00:09:44 -0800
commita0204330869723c10ac145a257ff02024b8add3d (patch)
treecd9c37843cc62555182c175401a3639c79357051 /rust
parentd0c590401d28d949b825cab1462549e41c1046af (diff)
[Rust] Fix UB when passing include directories to `CoreTypeParser`
Diffstat (limited to 'rust')
-rw-r--r--rust/src/types/parser.rs36
1 files changed, 26 insertions, 10 deletions
diff --git a/rust/src/types/parser.rs b/rust/src/types/parser.rs
index 1ee07188..18fe363f 100644
--- a/rust/src/types/parser.rs
+++ b/rust/src/types/parser.rs
@@ -83,10 +83,18 @@ impl TypeParser for CoreTypeParser {
platform: &Platform,
existing_types: &TypeContainer,
options: &[String],
- include_dirs: &[String],
+ include_directories: &[String],
) -> Result<String, Vec<TypeParserError>> {
let source_cstr = BnString::new(source);
let file_name_cstr = BnString::new(file_name);
+ let options: Vec<_> = options.into_iter().map(|o| o.to_cstr()).collect();
+ let options_raw: Vec<*const c_char> = options.iter().map(|o| o.as_ptr()).collect();
+ let include_directories: Vec<_> = include_directories
+ .into_iter()
+ .map(|d| d.to_cstr())
+ .collect();
+ let include_directories_raw: Vec<*const c_char> =
+ include_directories.iter().map(|d| d.as_ptr()).collect();
let mut result = std::ptr::null_mut();
let mut errors = std::ptr::null_mut();
let mut error_count = 0;
@@ -97,10 +105,10 @@ impl TypeParser for CoreTypeParser {
file_name_cstr.as_ptr(),
platform.handle,
existing_types.handle.as_ptr(),
- options.as_ptr() as *const *const c_char,
- options.len(),
- include_dirs.as_ptr() as *const *const c_char,
- include_dirs.len(),
+ options_raw.as_ptr() as *const *const c_char,
+ options_raw.len(),
+ include_directories_raw.as_ptr() as *const *const c_char,
+ include_directories_raw.len(),
&mut result,
&mut errors,
&mut error_count,
@@ -123,11 +131,19 @@ impl TypeParser for CoreTypeParser {
platform: &Platform,
existing_types: &TypeContainer,
options: &[String],
- include_dirs: &[String],
+ include_directories: &[String],
auto_type_source: &str,
) -> Result<TypeParserResult, Vec<TypeParserError>> {
let source_cstr = BnString::new(source);
let file_name_cstr = BnString::new(file_name);
+ let options: Vec<_> = options.into_iter().map(|o| o.to_cstr()).collect();
+ let options_raw: Vec<*const c_char> = options.iter().map(|o| o.as_ptr()).collect();
+ let include_directories: Vec<_> = include_directories
+ .into_iter()
+ .map(|d| d.to_cstr())
+ .collect();
+ let include_directories_raw: Vec<*const c_char> =
+ include_directories.iter().map(|d| d.as_ptr()).collect();
let auto_type_source = BnString::new(auto_type_source);
let mut raw_result = BNTypeParserResult::default();
let mut errors = std::ptr::null_mut();
@@ -139,10 +155,10 @@ impl TypeParser for CoreTypeParser {
file_name_cstr.as_ptr(),
platform.handle,
existing_types.handle.as_ptr(),
- options.as_ptr() as *const *const c_char,
- options.len(),
- include_dirs.as_ptr() as *const *const c_char,
- include_dirs.len(),
+ options_raw.as_ptr() as *const *const c_char,
+ options_raw.len(),
+ include_directories_raw.as_ptr() as *const *const c_char,
+ include_directories_raw.len(),
auto_type_source.as_ptr(),
&mut raw_result,
&mut errors,