Forbid / in scheme names.

This commit is contained in:
4lDO2
2023-10-27 09:06:59 +02:00
parent 29803e7865
commit 192d663d84
2 changed files with 31 additions and 27 deletions
+2 -2
View File
@@ -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();
+29 -25
View File
@@ -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();