From 192d663d84a40108016a5fbabcab3f669adf5cad Mon Sep 17 00:00:00 2001 From: 4lDO2 <4lDO2@protonmail.com> Date: Fri, 27 Oct 2023 09:06:59 +0200 Subject: [PATCH] Forbid / in scheme names. --- src/scheme/mod.rs | 4 ++-- src/scheme/root.rs | 54 +++++++++++++++++++++++++--------------------- 2 files changed, 31 insertions(+), 27 deletions(-) diff --git a/src/scheme/mod.rs b/src/scheme/mod.rs index e277457564..2b1ef18f0c 100644 --- a/src/scheme/mod.rs +++ b/src/scheme/mod.rs @@ -166,10 +166,10 @@ impl SchemeList { // These schemes should only be available on the root #[cfg(all(feature = "acpi", any(target_arch = "x86", target_arch = "x86_64")))] { - self.insert(ns, "kernel/acpi", |scheme_id| Arc::new(AcpiScheme::new(scheme_id))).unwrap(); + self.insert(ns, "kernel.acpi", |scheme_id| Arc::new(AcpiScheme::new(scheme_id))).unwrap(); } #[cfg(all(any(target_arch = "aarch64")))] { - self.insert(ns, "kernel/dtb", |scheme_id| Arc::new(DtbScheme::new(scheme_id))).unwrap(); + self.insert(ns, "kernel.dtb", |scheme_id| Arc::new(DtbScheme::new(scheme_id))).unwrap(); } self.insert(ns, "debug", |scheme_id| Arc::new(DebugScheme::new(scheme_id))).unwrap(); self.insert(ns, "irq", |scheme_id| Arc::new(IrqScheme::new(scheme_id))).unwrap(); diff --git a/src/scheme/root.rs b/src/scheme/root.rs index 0159be8cd1..6a8fb88419 100644 --- a/src/scheme/root.rs +++ b/src/scheme/root.rs @@ -73,33 +73,37 @@ impl Scheme for RootScheme { //TODO: Make this follow standards for flags and errors if flags & O_CREAT == O_CREAT { - if uid == 0 { - let context = { - let contexts = context::contexts(); - let context = contexts.current().ok_or(Error::new(ESRCH))?; - Arc::downgrade(context) - }; + if uid != 0 { + return Err(Error::new(EACCES)); + }; - let id = self.next_id.fetch_add(1, Ordering::SeqCst); - - let inner = { - let path_box = path.to_string().into_boxed_str(); - let mut schemes = scheme::schemes_mut(); - - let (_scheme_id, inner) = schemes.insert_and_pass(self.scheme_ns, path, |scheme_id| { - let inner = Arc::new(UserInner::new(self.scheme_id, scheme_id, id, path_box, flags, context)); - (Arc::new(UserScheme::new(Arc::downgrade(&inner))), inner) - })?; - - inner - }; - - self.handles.write().insert(id, Handle::Scheme(inner)); - - Ok(id) - } else { - Err(Error::new(EACCES)) + if path.contains('/') { + return Err(Error::new(EINVAL)); } + + let context = { + let contexts = context::contexts(); + let context = contexts.current().ok_or(Error::new(ESRCH))?; + Arc::downgrade(context) + }; + + let id = self.next_id.fetch_add(1, Ordering::Relaxed); + + let inner = { + let path_box = path.to_string().into_boxed_str(); + let mut schemes = scheme::schemes_mut(); + + let (_scheme_id, inner) = schemes.insert_and_pass(self.scheme_ns, path, |scheme_id| { + let inner = Arc::new(UserInner::new(self.scheme_id, scheme_id, id, path_box, flags, context)); + (Arc::new(UserScheme::new(Arc::downgrade(&inner))), inner) + })?; + + inner + }; + + self.handles.write().insert(id, Handle::Scheme(inner)); + + Ok(id) } else if path.is_empty() { let scheme_ns = { let contexts = context::contexts();