fix(driver): fix memory security problem in tty device ioctl (#833)

* add soft link to musl-gcc

* fix the tty_ioctl

* modified

* modified
This commit is contained in:
laokengwt 2024-05-31 10:20:51 +08:00 committed by GitHub
parent de199e3c86
commit 415e14e9c3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 45 additions and 20 deletions

View File

@ -34,7 +34,7 @@ use crate::{
spinlock::SpinLockGuard, spinlock::SpinLockGuard,
}, },
mm::VirtAddr, mm::VirtAddr,
net::event_poll::{EPollItem, EventPoll}, net::event_poll::{EPollItem, KernelIoctlData},
process::ProcessManager, process::ProcessManager,
syscall::user_access::{UserBufferReader, UserBufferWriter}, syscall::user_access::{UserBufferReader, UserBufferWriter},
}; };
@ -308,6 +308,35 @@ impl IndexNode for TtyDevice {
Ok(()) Ok(())
} }
fn kernel_ioctl(
&self,
arg: Arc<dyn KernelIoctlData>,
data: &FilePrivateData,
) -> Result<usize, SystemError> {
let epitem = arg
.arc_any()
.downcast::<EPollItem>()
.map_err(|_| SystemError::EFAULT)?;
let _ = UserBufferReader::new(
&epitem as *const Arc<EPollItem>,
core::mem::size_of::<Arc<EPollItem>>(),
false,
)?;
let (tty, _) = if let FilePrivateData::Tty(tty_priv) = data {
(tty_priv.tty(), tty_priv.mode)
} else {
return Err(SystemError::EIO);
};
let core = tty.core();
core.add_epitem(epitem.clone());
return Ok(0);
}
fn ioctl(&self, cmd: u32, arg: usize, data: &FilePrivateData) -> Result<usize, SystemError> { fn ioctl(&self, cmd: u32, arg: usize, data: &FilePrivateData) -> Result<usize, SystemError> {
let (tty, _) = if let FilePrivateData::Tty(tty_priv) = data { let (tty, _) = if let FilePrivateData::Tty(tty_priv) = data {
(tty_priv.tty(), tty_priv.mode) (tty_priv.tty(), tty_priv.mode)
@ -326,20 +355,6 @@ impl IndexNode for TtyDevice {
todo!() todo!()
} }
} }
EventPoll::ADD_EPOLLITEM => {
let _ = UserBufferReader::new(
arg as *const Arc<EPollItem>,
core::mem::size_of::<Arc<EPollItem>>(),
false,
)?;
let epitem = unsafe { &*(arg as *const Arc<EPollItem>) };
let core = tty.core();
core.add_epitem(epitem.clone());
return Ok(0);
}
_ => {} _ => {}
} }

View File

@ -492,11 +492,7 @@ impl File {
return inode.inner().lock().add_epoll(epitem); return inode.inner().lock().add_epoll(epitem);
} }
_ => { _ => {
let r = self.inode.ioctl( let r = self.inode.kernel_ioctl(epitem, &self.private_data.lock());
EventPoll::ADD_EPOLLITEM,
&epitem as *const Arc<EPollItem> as usize,
&self.private_data.lock(),
);
if r.is_err() { if r.is_err() {
return Err(SystemError::ENOSYS); return Err(SystemError::ENOSYS);
} }

View File

@ -350,6 +350,14 @@ pub trait IndexNode: Any + Sync + Send + Debug + CastFromSync {
return Err(SystemError::ENOSYS); return Err(SystemError::ENOSYS);
} }
fn kernel_ioctl(
&self,
_arg: Arc<dyn crate::net::event_poll::KernelIoctlData>,
_data: &FilePrivateData,
) -> Result<usize, SystemError> {
return Err(SystemError::ENOSYS);
}
/// @brief 获取inode所在的文件系统的指针 /// @brief 获取inode所在的文件系统的指针
fn fs(&self) -> Arc<dyn FileSystem>; fn fs(&self) -> Arc<dyn FileSystem>;

View File

@ -1,4 +1,5 @@
use core::{ use core::{
any::Any,
fmt::Debug, fmt::Debug,
sync::atomic::{AtomicBool, Ordering}, sync::atomic::{AtomicBool, Ordering},
}; };
@ -8,6 +9,7 @@ use alloc::{
sync::{Arc, Weak}, sync::{Arc, Weak},
vec::Vec, vec::Vec,
}; };
use intertrait::CastFromSync;
use system_error::SystemError; use system_error::SystemError;
use crate::{ use crate::{
@ -130,6 +132,10 @@ impl EPollItem {
} }
} }
pub trait KernelIoctlData: Send + Sync + Any + Debug + CastFromSync {}
impl KernelIoctlData for EPollItem {}
/// ### Epoll文件的私有信息 /// ### Epoll文件的私有信息
#[derive(Debug, Clone)] #[derive(Debug, Clone)]
pub struct EPollPrivateData { pub struct EPollPrivateData {