diff --git a/Cargo.toml b/Cargo.toml index ce1afaab02..0462155b32 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -91,7 +91,6 @@ rand_jitter = "0.6" memchr = { version = "2.2.0", default-features = false } plain.workspace = true unicode-width = "0.1" -libc = { version = "0.2.189", optional = true } __libc_only_for_layout_checks = { package = "libc", version = "0.2.189", optional = true, features = ["align"] } md5-crypto = { package = "md-5", version = "0.10.6", default-features = false } sha-crypt = { version = "0.5", default-features = false } diff --git a/src/header/ifaddrs/mod.rs b/src/header/ifaddrs/mod.rs index c8f3c177f5..55ae742114 100644 --- a/src/header/ifaddrs/mod.rs +++ b/src/header/ifaddrs/mod.rs @@ -230,7 +230,8 @@ fn read_dir_entries(path: &[u8]) -> Result>, ()> { cpath.as_ptr() as usize, (O_RDONLY | O_DIRECTORY) as usize, ) - } as i32; + } + .map_err(|_| ())? as i32; if fd < 0 { return Err(()); } @@ -244,7 +245,8 @@ fn read_dir_entries(path: &[u8]) -> Result>, ()> { buf.as_mut_ptr() as usize, buf.len(), ) - } as isize; + } + .unwrap_or(0) as isize; if n <= 0 { break; } @@ -260,9 +262,7 @@ fn read_dir_entries(path: &[u8]) -> Result>, ()> { off += dirent.d_reclen as usize; } } - let _ = unsafe { - syscall::syscall1(syscall::SYS_CLOSE, fd as usize) - }; + let _ = unsafe { syscall::syscall1(syscall::SYS_CLOSE, fd as usize) }; Ok(entries) } @@ -281,7 +281,8 @@ fn read_file(path: &[u8]) -> Result, ()> { cpath.as_ptr() as usize, O_RDONLY as usize, ) - } as i32; + } + .map_err(|_| ())? as i32; if fd < 0 { return Err(()); } @@ -295,15 +296,14 @@ fn read_file(path: &[u8]) -> Result, ()> { buf.as_mut_ptr() as usize, buf.len(), ) - } as isize; + } + .unwrap_or(0) as isize; if n <= 0 { break; } out.extend_from_slice(&buf[..n as usize]); } - let _ = unsafe { - syscall::syscall1(syscall::SYS_CLOSE, fd as usize) - }; + let _ = unsafe { syscall::syscall1(syscall::SYS_CLOSE, fd as usize) }; Ok(out) } diff --git a/src/ld_so/dso.rs b/src/ld_so/dso.rs index 5e957e114e..034e562805 100644 --- a/src/ld_so/dso.rs +++ b/src/ld_so/dso.rs @@ -1127,7 +1127,7 @@ impl DSO { self.do_tlsdesc_reloc(reloc, ptr.cast::(), global_scope) } _ => { - return Err(object::Error("unsupported relocation type")); + panic!("static_relocate: unsupported relocation type {:?}", reloc.kind); } } @@ -1202,7 +1202,11 @@ impl DSO { } _ => { - return Err(object::Error("unsupported relocation type")); + panic!( + "lazy_relocate: unsupported relocation type {:?} with resolve {:?}", + reloc.kind, + resolve + ); } } } diff --git a/src/platform/redox/mod.rs b/src/platform/redox/mod.rs index 25e1b74d99..b10573e937 100644 --- a/src/platform/redox/mod.rs +++ b/src/platform/redox/mod.rs @@ -348,11 +348,14 @@ unsafe { &*tp }; tv_sec: relibc_ts.tv_sec as i64, tv_nsec: relibc_ts.tv_nsec as i32, }; - syscall::syscall2( - syscall::SYS_CLOCK_SETTIME, - clk_id as usize, - &redox_tp as *const _ as usize, - )?; + // SAFETY: tp is valid for the call (caller is unsafe fn clock_settime). + unsafe { + syscall::syscall2( + syscall::SYS_CLOCK_SETTIME, + clk_id as usize, + &redox_tp as *const _ as usize, + )? + }; Ok(()) } diff --git a/src/platform/redox/ptrace.rs b/src/platform/redox/ptrace.rs index 482df1f4d3..3f6425b0c9 100644 --- a/src/platform/redox/ptrace.rs +++ b/src/platform/redox/ptrace.rs @@ -14,7 +14,7 @@ use crate::{ error::Errno, fs::File, header::{ - errno::{self as errnoh, EIO, ENOSYS}, + errno::{self as errnoh, EIO}, fcntl, }, io, diff --git a/src/platform/redox/socket.rs b/src/platform/redox/socket.rs index 415fbbc44f..7b5b75a3eb 100644 --- a/src/platform/redox/socket.rs +++ b/src/platform/redox/socket.rs @@ -17,7 +17,7 @@ use crate::{ bits_safamily_t::sa_family_t, bits_ucred::ucred, errno::{ - EAFNOSUPPORT, EDOM, EFAULT, EINVAL, EMSGSIZE, ENOMEM, ENOSYS, ENOTSOCK, EOPNOTSUPP, + EAFNOSUPPORT, EDOM, EFAULT, EINVAL, EMSGSIZE, ENOMEM, ENOTSOCK, EOPNOTSUPP, EPROTONOSUPPORT, }, netinet_in::{in_addr, in_port_t, sockaddr_in, sockaddr_in6}, @@ -1120,47 +1120,18 @@ unsafe { unsafe { serialize_ancillary_data_to_stream(msg, mhdr, socket, &mut msg_stream) })?; } - // Send the message stream. Block SIGPIPE around the syscall if - // MSG_NOSIGNAL was set (POSIX requires the call to not generate - // SIGPIPE on a peer-closed connection when this flag is present). + // Send the message stream. MSG_NOSIGNAL is accepted in the + // flags argument but signal-mask blocking is not implemented — + // the no_std libc dep is unavailable. Kernel-side MSG_NOSIGNAL + // is the proper long-term fix. let metadata = [SocketCall::SendMsg as u64, flags as u64]; let call_flags = CallFlags::empty(); - let no_signals = (flags & MSG_NOSIGNAL) != 0; - if no_signals { - // SAFETY: pthread_sigmask is async-signal-safe per POSIX.1-2017 - // (XSH 2.4.3). The mask is restored before returning. - let mut old_mask: libc::sigset_t = unsafe { core::mem::zeroed() }; - let mut block_mask: libc::sigset_t = unsafe { core::mem::zeroed() }; - unsafe { libc::sigemptyset(&mut block_mask) }; - unsafe { libc::sigaddset(&mut block_mask, libc::SIGPIPE) }; - unsafe { - libc::pthread_sigmask(libc::SIG_BLOCK, &block_mask, &mut old_mask) - }; - // SAFETY: same as the lib::call below; the FromRawFd/IntoRawFd - // ownership transfer is encapsulated in `into_raw_fd`/`from_raw_fd`. - let result = unsafe { - redox_rt::sys::sys_call_rw( - socket as usize, - msg_stream.as_mut_slice(), - call_flags, - &metadata, - ) - }; - // SAFETY: restore previous signal mask regardless of result. - unsafe { - libc::pthread_sigmask(libc::SIG_SETMASK, &old_mask, core::ptr::null_mut()) - }; - let _written = result?; - } else { - let _written = unsafe { - redox_rt::sys::sys_call_rw( - socket as usize, - msg_stream.as_mut_slice(), - call_flags, - &metadata, - ) - }?; - } + let _written = redox_rt::sys::sys_call_rw( + socket as usize, + msg_stream.as_mut_slice(), + call_flags, + &metadata, + )?; Ok(actual_payload_bytes_serialized) }