mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-08 18:26:48 +00:00
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:
parent
de199e3c86
commit
415e14e9c3
@ -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);
|
|
||||||
}
|
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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>;
|
||||||
|
|
||||||
|
@ -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 {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user