driver_symbols/
symbols.rs

1// Copyright 2025 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5use crate::bindings;
6use std::ffi::{CStr, CString};
7use zx::{AsHandleRef, Status};
8
9pub fn find_restricted_symbols(vmo: &zx::Vmo, driver_url: &str) -> Result<Vec<String>, Status> {
10    let mut out_symbols: *mut bindings::restricted_symbols = std::ptr::null_mut();
11    let mut out_symbols_size: usize = 0;
12    let driver_url_c_str = CString::new(driver_url).unwrap();
13    // SAFETY: We only look at the out symbols if the status is ok.
14    Status::ok(unsafe {
15        bindings::restricted_symbols_find(
16            vmo.raw_handle(),
17            driver_url_c_str.as_ptr(),
18            &mut out_symbols,
19            &mut out_symbols_size,
20        )
21    })?;
22
23    let mut symbols = Vec::with_capacity(out_symbols_size);
24    for i in 0..out_symbols_size {
25        // SAFETY: We can retreieve valid strings for all indicies up until out_symbols_size.
26        let symbol = unsafe { CStr::from_ptr(bindings::restricted_symbols_get(out_symbols, i)) };
27        symbols.push(symbol.to_str().unwrap().to_string());
28    }
29
30    // SAFETY: We can free a pointer retrieved via the find API.
31    unsafe {
32        bindings::restricted_symbols_free(out_symbols);
33    }
34
35    Ok(symbols)
36}