From 141094e95e0c49e2917ddbdd3bba6d422d786889 Mon Sep 17 00:00:00 2001 From: WangRunji Date: Mon, 22 Apr 2019 21:55:57 +0800 Subject: [PATCH] fix return value from libc::ocall --- src/libos/src/fs/io_multiplexing.rs | 81 ++++++++++++++++------------- src/libos/src/fs/socket_file.rs | 8 +-- src/libos/src/syscall/mod.rs | 24 +++++++++ 3 files changed, 72 insertions(+), 41 deletions(-) diff --git a/src/libos/src/fs/io_multiplexing.rs b/src/libos/src/fs/io_multiplexing.rs index 79f18062..f3f52951 100644 --- a/src/libos/src/fs/io_multiplexing.rs +++ b/src/libos/src/fs/io_multiplexing.rs @@ -1,9 +1,9 @@ use super::*; use crate::syscall::AsSocket; -use std::vec::Vec; +use std::any::Any; use std::collections::btree_map::BTreeMap; use std::fmt; -use std::any::Any; +use std::vec::Vec; /// Forward to host `poll` /// (sgx_libc doesn't have `select`) @@ -23,7 +23,11 @@ pub fn do_select( let file_table_ref = proc.get_files().lock().unwrap(); for fd in 0..nfds { - let (r, w, e) = (readfds.is_set(fd), writefds.is_set(fd), exceptfds.is_set(fd)); + let (r, w, e) = ( + readfds.is_set(fd), + writefds.is_set(fd), + exceptfds.is_set(fd), + ); if !(r || w || e) { continue; } @@ -31,9 +35,15 @@ pub fn do_select( host_to_libos_fd[host_fd as usize] = fd; let mut events = 0; - if r { events |= libc::POLLIN; } - if w { events |= libc::POLLOUT; } - if e { events |= libc::POLLERR; } + if r { + events |= libc::POLLIN; + } + if w { + events |= libc::POLLOUT; + } + if e { + events |= libc::POLLERR; + } polls.push(libc::pollfd { fd: host_fd as c_int, @@ -47,12 +57,10 @@ pub fn do_select( Some(tv) => (tv.tv_sec * 1000 + tv.tv_usec / 1000) as i32, }; - let ret = unsafe { - libc::ocall::poll(polls.as_mut_ptr(), polls.len() as u64, timeout) - }; + let ret = unsafe { libc::ocall::poll(polls.as_mut_ptr(), polls.len() as u64, timeout) }; if ret < 0 { - return errno!(Errno::from_retval(ret as i32), ""); + return errno!(Errno::from_retval(unsafe { libc::errno() }), ""); } // convert fd back and write fdset @@ -76,10 +84,7 @@ pub fn do_select( Ok(ret as usize) } -pub fn do_poll( - polls: &mut [libc::pollfd], - timeout: c_int, -) -> Result { +pub fn do_poll(polls: &mut [libc::pollfd], timeout: c_int) -> Result { info!("poll: [..], timeout: {}", timeout); let current_ref = process::get_current(); @@ -91,13 +96,11 @@ pub fn do_poll( let socket = file_ref.as_socket()?; poll.fd = socket.fd(); } - let ret = unsafe { - libc::ocall::poll(polls.as_mut_ptr(), polls.len() as u64, timeout) - }; + let ret = unsafe { libc::ocall::poll(polls.as_mut_ptr(), polls.len() as u64, timeout) }; // recover fd ? if ret < 0 { - errno!(Errno::from_retval(ret as i32), "") + errno!(Errno::from_retval(unsafe { libc::errno() }), "") } else { Ok(ret as usize) } @@ -112,7 +115,10 @@ pub fn do_epoll_create1(flags: c_int) -> Result { let mut proc = current_ref.lock().unwrap(); let fd = { let close_on_spawn = flags & libc::EPOLL_CLOEXEC != 0; - proc.get_files().lock().unwrap().put(file_ref, close_on_spawn) + proc.get_files() + .lock() + .unwrap() + .put(file_ref, close_on_spawn) }; Ok(fd) } @@ -142,7 +148,12 @@ pub fn do_epoll_wait( events: &mut [libc::epoll_event], timeout: c_int, ) -> Result { - info!("epoll_wait: epfd: {}, len: {:?}, timeout: {}", epfd, events.len(), timeout); + info!( + "epoll_wait: epfd: {}, len: {:?}, timeout: {}", + epfd, + events.len(), + timeout + ); let current_ref = process::get_current(); let mut proc = current_ref.lock().unwrap(); @@ -187,7 +198,7 @@ pub struct EpollFile { impl EpollFile { pub fn new() -> Result { Ok(Self { - inner: SgxMutex::new(EpollFileInner::new()?) + inner: SgxMutex::new(EpollFileInner::new()?), }) } } @@ -202,25 +213,21 @@ impl EpollFileInner { pub fn new() -> Result { let ret = unsafe { libc::ocall::epoll_create1(0) }; if ret < 0 { - return errno!(Errno::from_retval(ret as i32), ""); + return errno!(Errno::from_retval(unsafe { libc::errno() }), ""); } - Ok(EpollFileInner { - epoll_fd: ret, - }) + Ok(EpollFileInner { epoll_fd: ret }) } - - pub fn ctl(&mut self, op: c_int, host_fd: FileDesc, event: *const libc::epoll_event) -> Result<(), Error> { - let ret = unsafe { - libc::ocall::epoll_ctl( - self.epoll_fd, - op, - host_fd as c_int, - event as *mut _, - ) - }; + pub fn ctl( + &mut self, + op: c_int, + host_fd: FileDesc, + event: *const libc::epoll_event, + ) -> Result<(), Error> { + let ret = + unsafe { libc::ocall::epoll_ctl(self.epoll_fd, op, host_fd as c_int, event as *mut _) }; if ret < 0 { - return errno!(Errno::from_retval(ret as i32), ""); + return errno!(Errno::from_retval(unsafe { libc::errno() }), ""); } Ok(()) } @@ -241,7 +248,7 @@ impl EpollFileInner { ) }; if ret < 0 { - return errno!(Errno::from_retval(ret as i32), ""); + return errno!(Errno::from_retval(unsafe { libc::errno() }), ""); } Ok(ret as usize) } diff --git a/src/libos/src/fs/socket_file.rs b/src/libos/src/fs/socket_file.rs index 3bb5e8fb..a84f545a 100644 --- a/src/libos/src/fs/socket_file.rs +++ b/src/libos/src/fs/socket_file.rs @@ -11,7 +11,7 @@ impl SocketFile { pub fn new(domain: c_int, socket_type: c_int, protocol: c_int) -> Result { let ret = unsafe { libc::ocall::socket(domain, socket_type, protocol) }; if ret < 0 { - errno!(Errno::from_retval(ret as i32), "") + errno!(Errno::from_retval(unsafe { libc::errno() }), "") } else { Ok(SocketFile { fd: ret }) } @@ -25,7 +25,7 @@ impl SocketFile { ) -> Result { let ret = unsafe { libc::ocall::accept4(self.fd, addr, addr_len, flags) }; if ret < 0 { - errno!(Errno::from_retval(ret as i32), "") + errno!(Errno::from_retval(unsafe { libc::errno() }), "") } else { Ok(SocketFile { fd: ret }) } @@ -49,7 +49,7 @@ impl File for SocketFile { fn read(&self, buf: &mut [u8]) -> Result { let ret = unsafe { libc::ocall::read(self.fd, buf.as_mut_ptr() as *mut c_void, buf.len()) }; if ret < 0 { - errno!(Errno::from_retval(ret as i32), "") + errno!(Errno::from_retval(unsafe { libc::errno() }), "") } else { Ok(ret as usize) } @@ -58,7 +58,7 @@ impl File for SocketFile { fn write(&self, buf: &[u8]) -> Result { let ret = unsafe { libc::ocall::write(self.fd, buf.as_ptr() as *const c_void, buf.len()) }; if ret < 0 { - errno!(Errno::from_retval(ret as i32), "") + errno!(Errno::from_retval(unsafe { libc::errno() }), "") } else { Ok(ret as usize) } diff --git a/src/libos/src/syscall/mod.rs b/src/libos/src/syscall/mod.rs index fabb966a..927c5678 100644 --- a/src/libos/src/syscall/mod.rs +++ b/src/libos/src/syscall/mod.rs @@ -942,6 +942,9 @@ fn do_connect( let socket = file_ref.as_socket()?; let ret = unsafe { libc::ocall::connect(socket.fd(), addr, addr_len) }; + if ret < 0 { + return errno!(Errno::from_retval(unsafe { libc::errno() }), ""); + } Ok(ret as isize) } @@ -975,6 +978,9 @@ fn do_shutdown(fd: c_int, how: c_int) -> Result { let socket = file_ref.as_socket()?; let ret = unsafe { libc::ocall::shutdown(socket.fd(), how) }; + if ret < 0 { + return errno!(Errno::from_retval(unsafe { libc::errno() }), ""); + } Ok(ret as isize) } @@ -990,6 +996,9 @@ fn do_bind( let socket = file_ref.as_socket()?; let ret = unsafe { libc::ocall::bind(socket.fd(), addr, addr_len) }; + if ret < 0 { + return errno!(Errno::from_retval(unsafe { libc::errno() }), ""); + } Ok(ret as isize) } @@ -1001,6 +1010,9 @@ fn do_listen(fd: c_int, backlog: c_int) -> Result { let socket = file_ref.as_socket()?; let ret = unsafe { libc::ocall::listen(socket.fd(), backlog) }; + if ret < 0 { + return errno!(Errno::from_retval(unsafe { libc::errno() }), ""); + } Ok(ret as isize) } @@ -1021,6 +1033,9 @@ fn do_setsockopt( let socket = file_ref.as_socket()?; let ret = unsafe { libc::ocall::setsockopt(socket.fd(), level, optname, optval, optlen) }; + if ret < 0 { + return errno!(Errno::from_retval(unsafe { libc::errno() }), ""); + } Ok(ret as isize) } @@ -1041,6 +1056,9 @@ fn do_getsockopt( let socket = file_ref.as_socket()?; let ret = unsafe { libc::ocall::getsockopt(socket.fd(), level, optname, optval, optlen) }; + if ret < 0 { + return errno!(Errno::from_retval(unsafe { libc::errno() }), ""); + } Ok(ret as isize) } @@ -1062,6 +1080,9 @@ fn do_sendto( let socket = file_ref.as_socket()?; let ret = unsafe { libc::ocall::sendto(socket.fd(), base, len, flags, addr, addr_len) }; + if ret < 0 { + return errno!(Errno::from_retval(unsafe { libc::errno() }), ""); + } Ok(ret as isize) } @@ -1083,6 +1104,9 @@ fn do_recvfrom( let socket = file_ref.as_socket()?; let ret = unsafe { libc::ocall::recvfrom(socket.fd(), base, len, flags, addr, addr_len) }; + if ret < 0 { + return errno!(Errno::from_retval(unsafe { libc::errno() }), ""); + } Ok(ret as isize) }