about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTomoaki Kawada <kawada@kmckk.co.jp>2022-02-10 13:10:25 +0900
committerTomoaki Kawada <kawada@kmckk.co.jp>2022-02-10 13:33:35 +0900
commit64406c5996a0775493c8a2acd457e612bd84cde6 (patch)
tree2c8e1a1d96f1e8596ecf858bf8ff998736a01bce
parent9a5a961be97f405e751dd2cf966e1cdb80a612c2 (diff)
downloadrust-64406c5996a0775493c8a2acd457e612bd84cde6.tar.gz
rust-64406c5996a0775493c8a2acd457e612bd84cde6.zip
kmc-solid: Use the filesystem thread-safety wrapper
Neither the SOLID filesystem API nor built-in filesystems guarantee
thread safety by default. Although this may suffice in general embedded-
system use cases, and in fact the API can be used from multiple threads
without any problems in many cases, this has been a source of
unsoundness in `std::sys::solid::fs`.

This commit updates the `std` code to leverage the filesystem thread-
safety wrapper to enforce thread safety. This is done by prefixing all
paths passed to the filesystem API with `\TS`. (Note that relative paths
aren't supported in this platform.)
-rw-r--r--library/std/src/sys/solid/fs.rs21
1 files changed, 20 insertions, 1 deletions
diff --git a/library/std/src/sys/solid/fs.rs b/library/std/src/sys/solid/fs.rs
index a6ed10f7789..a2cbee4dcf0 100644
--- a/library/std/src/sys/solid/fs.rs
+++ b/library/std/src/sys/solid/fs.rs
@@ -289,7 +289,26 @@ impl OpenOptions {
 }
 
 fn cstr(path: &Path) -> io::Result<CString> {
-    Ok(CString::new(path.as_os_str().as_bytes())?)
+    let path = path.as_os_str().as_bytes();
+
+    if !path.starts_with(br"\") {
+        // Relative paths aren't supported
+        return Err(crate::io::const_io_error!(
+            crate::io::ErrorKind::Unsupported,
+            "relative path is not supported on this platform",
+        ));
+    }
+
+    // Apply the thread-safety wrapper
+    const SAFE_PREFIX: &[u8] = br"\TS";
+    let wrapped_path = [SAFE_PREFIX, &path, &[0]].concat();
+
+    CString::from_vec_with_nul(wrapped_path).map_err(|_| {
+        crate::io::const_io_error!(
+            io::ErrorKind::InvalidInput,
+            "path provided contains a nul byte",
+        )
+    })
 }
 
 impl File {