Fix the range of IoMem's reader/writer

This commit is contained in:
Qingsong Chen 2024-11-04 03:39:54 +00:00 committed by Tate, Hongliang Tian
parent 5233827160
commit 438dad888e
1 changed files with 8 additions and 12 deletions

View File

@ -125,8 +125,8 @@ impl IoMem {
// safety of reading from the mapped physical address, and the mapping is valid. // safety of reading from the mapped physical address, and the mapping is valid.
unsafe { unsafe {
VmReader::from_kernel_space( VmReader::from_kernel_space(
self.kvirt_area.deref().start() as *mut u8, (self.kvirt_area.deref().start() + self.offset) as *mut u8,
self.kvirt_area.deref().len(), self.limit,
) )
} }
} }
@ -136,8 +136,8 @@ impl IoMem {
// safety of writing to the mapped physical address, and the mapping is valid. // safety of writing to the mapped physical address, and the mapping is valid.
unsafe { unsafe {
VmWriter::from_kernel_space( VmWriter::from_kernel_space(
self.kvirt_area.deref().start() as *mut u8, (self.kvirt_area.deref().start() + self.offset) as *mut u8,
self.kvirt_area.deref().len(), self.limit,
) )
} }
} }
@ -147,9 +147,7 @@ impl VmIo for IoMem {
fn read(&self, offset: usize, writer: &mut VmWriter) -> Result<()> { fn read(&self, offset: usize, writer: &mut VmWriter) -> Result<()> {
let offset = offset + self.offset; let offset = offset + self.offset;
if self if self
.kvirt_area .limit
.deref()
.len()
.checked_sub(offset) .checked_sub(offset)
.is_none_or(|remain| remain < writer.avail()) .is_none_or(|remain| remain < writer.avail())
{ {
@ -168,9 +166,7 @@ impl VmIo for IoMem {
fn write(&self, offset: usize, reader: &mut VmReader) -> Result<()> { fn write(&self, offset: usize, reader: &mut VmReader) -> Result<()> {
let offset = offset + self.offset; let offset = offset + self.offset;
if self if self
.kvirt_area .limit
.deref()
.len()
.checked_sub(offset) .checked_sub(offset)
.is_none_or(|remain| remain < reader.remain()) .is_none_or(|remain| remain < reader.remain())
{ {
@ -189,10 +185,10 @@ impl VmIo for IoMem {
impl VmIoOnce for IoMem { impl VmIoOnce for IoMem {
fn read_once<T: PodOnce>(&self, offset: usize) -> Result<T> { fn read_once<T: PodOnce>(&self, offset: usize) -> Result<T> {
self.reader().skip(offset + self.offset).read_once() self.reader().skip(offset).read_once()
} }
fn write_once<T: PodOnce>(&self, offset: usize, new_val: &T) -> Result<()> { fn write_once<T: PodOnce>(&self, offset: usize, new_val: &T) -> Result<()> {
self.writer().skip(offset + self.offset).write_once(new_val) self.writer().skip(offset).write_once(new_val)
} }
} }