vmbase,libfdt: Make cstr! safe & const-compatible
Test: m libvmbase
Test: m libpvmfw.bootargs.test
Test: m liblibfdt.integration_test
Change-Id: Ie6376fabf757b85a75c44ae4f0c04479c1a2c6d9
diff --git a/libs/libfdt/tests/api_test.rs b/libs/libfdt/tests/api_test.rs
index f4a4af5..0f8c1a2 100644
--- a/libs/libfdt/tests/api_test.rs
+++ b/libs/libfdt/tests/api_test.rs
@@ -17,14 +17,19 @@
//! Integration tests of the library libfdt.
use libfdt::{Fdt, FdtError, FdtNodeMut, Phandle};
-use std::ffi::{CStr, CString};
+use std::ffi::CString;
use std::fs;
use std::ops::Range;
// TODO(b/308694211): Use cstr!() from vmbase
macro_rules! cstr {
($str:literal) => {{
- CStr::from_bytes_with_nul(concat!($str, "\0").as_bytes()).unwrap()
+ const S: &str = concat!($str, "\0");
+ const C: &::core::ffi::CStr = match ::core::ffi::CStr::from_bytes_with_nul(S.as_bytes()) {
+ Ok(v) => v,
+ Err(_) => panic!("string contains interior NUL"),
+ };
+ C
}};
}
diff --git a/pvmfw/src/bootargs.rs b/pvmfw/src/bootargs.rs
index 800882c..a089a67 100644
--- a/pvmfw/src/bootargs.rs
+++ b/pvmfw/src/bootargs.rs
@@ -109,9 +109,16 @@
mod tests {
use super::*;
+ // TODO(b/308694211): Use cstr!() from vmbase
macro_rules! cstr {
($str:literal) => {{
- core::ffi::CStr::from_bytes_with_nul(concat!($str, "\0").as_bytes()).unwrap()
+ const S: &str = concat!($str, "\0");
+ const C: &::core::ffi::CStr = match ::core::ffi::CStr::from_bytes_with_nul(S.as_bytes())
+ {
+ Ok(v) => v,
+ Err(_) => panic!("string contains interior NUL"),
+ };
+ C
}};
}
diff --git a/vmbase/src/util.rs b/vmbase/src/util.rs
index 7fe6015..25586bc 100644
--- a/vmbase/src/util.rs
+++ b/vmbase/src/util.rs
@@ -20,7 +20,12 @@
#[macro_export]
macro_rules! cstr {
($str:literal) => {{
- core::ffi::CStr::from_bytes_with_nul(concat!($str, "\0").as_bytes()).unwrap()
+ const S: &str = concat!($str, "\0");
+ const C: &::core::ffi::CStr = match ::core::ffi::CStr::from_bytes_with_nul(S.as_bytes()) {
+ Ok(v) => v,
+ Err(_) => panic!("string contains interior NUL"),
+ };
+ C
}};
}