[libos] Fix gvisor setsockopt/getsockopt bugs
This commit is contained in:
parent
5dfa017a76
commit
b80450ef96
@ -35,7 +35,8 @@ impl GetSockOptRawCmd {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub fn output(&self) -> Option<&[u8]> {
|
pub fn output(&self) -> Option<&[u8]> {
|
||||||
self.optlen.map(|_| self.optval.as_ref())
|
self.optlen
|
||||||
|
.map(|opt_len| &self.optval[..(opt_len as usize)])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5,12 +5,11 @@ use libc::ocall::setsockopt as do_setsockopt;
|
|||||||
pub struct SetSockOptRawCmd {
|
pub struct SetSockOptRawCmd {
|
||||||
level: i32,
|
level: i32,
|
||||||
optname: i32,
|
optname: i32,
|
||||||
optval: Box<[u8]>,
|
optval: &'static [u8],
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SetSockOptRawCmd {
|
impl SetSockOptRawCmd {
|
||||||
pub fn new(level: i32, optname: i32, optval: &[u8]) -> Self {
|
pub fn new(level: i32, optname: i32, optval: &'static [u8]) -> Self {
|
||||||
let optval = Box::from(optval);
|
|
||||||
Self {
|
Self {
|
||||||
level,
|
level,
|
||||||
optname,
|
optname,
|
||||||
|
@ -274,10 +274,6 @@ pub fn do_setsockopt(
|
|||||||
);
|
);
|
||||||
let file_ref = current!().file(fd as FileDesc)?;
|
let file_ref = current!().file(fd as FileDesc)?;
|
||||||
|
|
||||||
if optval as usize != 0 && optlen == 0 && ENABLE_URING.load(Ordering::Relaxed) {
|
|
||||||
return_errno!(EINVAL, "the optlen size is 0");
|
|
||||||
}
|
|
||||||
|
|
||||||
let optval = from_user::make_slice(optval as *const u8, optlen as usize)?;
|
let optval = from_user::make_slice(optval as *const u8, optlen as usize)?;
|
||||||
|
|
||||||
if let Ok(host_socket) = file_ref.as_host_socket() {
|
if let Ok(host_socket) = file_ref.as_host_socket() {
|
||||||
@ -1132,7 +1128,11 @@ fn new_uring_getsockopt_cmd(
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Create a new ioctl command for host socket setsockopt syscall
|
/// Create a new ioctl command for host socket setsockopt syscall
|
||||||
fn new_host_setsockopt_cmd(level: i32, optname: i32, optval: &[u8]) -> Result<Box<dyn IoctlCmd>> {
|
fn new_host_setsockopt_cmd(
|
||||||
|
level: i32,
|
||||||
|
optname: i32,
|
||||||
|
optval: &'static [u8],
|
||||||
|
) -> Result<Box<dyn IoctlCmd>> {
|
||||||
if level != libc::SOL_SOCKET {
|
if level != libc::SOL_SOCKET {
|
||||||
return Ok(Box::new(SetSockOptRawCmd::new(level, optname, optval)));
|
return Ok(Box::new(SetSockOptRawCmd::new(level, optname, optval)));
|
||||||
}
|
}
|
||||||
@ -1162,7 +1162,7 @@ fn new_host_setsockopt_cmd(level: i32, optname: i32, optval: &[u8]) -> Result<Bo
|
|||||||
fn new_uring_setsockopt_cmd(
|
fn new_uring_setsockopt_cmd(
|
||||||
level: i32,
|
level: i32,
|
||||||
optname: i32,
|
optname: i32,
|
||||||
optval: &[u8],
|
optval: &'static [u8],
|
||||||
socket_type: Type,
|
socket_type: Type,
|
||||||
) -> Result<Box<dyn IoctlCmd>> {
|
) -> Result<Box<dyn IoctlCmd>> {
|
||||||
if level != libc::SOL_SOCKET {
|
if level != libc::SOL_SOCKET {
|
||||||
|
Loading…
Reference in New Issue
Block a user