Add new_fd range check for dup2/dup3
Signed-off-by: Zheng, Qi <huaiqing.zq@antgroup.com>
This commit is contained in:
parent
3c9e172550
commit
1eb58a5eb3
@ -1,4 +1,5 @@
|
|||||||
use super::*;
|
use super::*;
|
||||||
|
use misc::resource_t;
|
||||||
|
|
||||||
pub fn do_dup(old_fd: FileDesc) -> Result<FileDesc> {
|
pub fn do_dup(old_fd: FileDesc) -> Result<FileDesc> {
|
||||||
let current = current!();
|
let current = current!();
|
||||||
@ -11,6 +12,16 @@ pub fn do_dup2(old_fd: FileDesc, new_fd: FileDesc) -> Result<FileDesc> {
|
|||||||
let current = current!();
|
let current = current!();
|
||||||
let mut files = current.files().lock().unwrap();
|
let mut files = current.files().lock().unwrap();
|
||||||
let file = files.get(old_fd)?;
|
let file = files.get(old_fd)?;
|
||||||
|
let soft_rlimit_nofile = current!()
|
||||||
|
.rlimits()
|
||||||
|
.lock()
|
||||||
|
.unwrap()
|
||||||
|
.get(resource_t::RLIMIT_NOFILE)
|
||||||
|
.get_cur();
|
||||||
|
if new_fd as u64 >= soft_rlimit_nofile {
|
||||||
|
return_errno!(EBADF, "Invalid new_fd file descriptor");
|
||||||
|
}
|
||||||
|
|
||||||
if old_fd != new_fd {
|
if old_fd != new_fd {
|
||||||
files.put_at(new_fd, file, false);
|
files.put_at(new_fd, file, false);
|
||||||
}
|
}
|
||||||
@ -22,6 +33,16 @@ pub fn do_dup3(old_fd: FileDesc, new_fd: FileDesc, flags: u32) -> Result<FileDes
|
|||||||
let current = current!();
|
let current = current!();
|
||||||
let mut files = current.files().lock().unwrap();
|
let mut files = current.files().lock().unwrap();
|
||||||
let file = files.get(old_fd)?;
|
let file = files.get(old_fd)?;
|
||||||
|
let soft_rlimit_nofile = current!()
|
||||||
|
.rlimits()
|
||||||
|
.lock()
|
||||||
|
.unwrap()
|
||||||
|
.get(resource_t::RLIMIT_NOFILE)
|
||||||
|
.get_cur();
|
||||||
|
if new_fd as u64 >= soft_rlimit_nofile {
|
||||||
|
return_errno!(EBADF, "Invalid new_fd file descriptor");
|
||||||
|
}
|
||||||
|
|
||||||
if old_fd == new_fd {
|
if old_fd == new_fd {
|
||||||
return_errno!(EINVAL, "old_fd must not be equal to new_fd");
|
return_errno!(EINVAL, "old_fd must not be equal to new_fd");
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user