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
     }};
 }