[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