diff --git a/Cargo.toml b/Cargo.toml index dfe06ad86d..7365844a7d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -20,6 +20,7 @@ members = [ exclude = ["tests", "dlmalloc-rs"] [workspace.lints.clippy] +borrow_as_ptr = "warn" # TODO review occurrences cast_lossless = "warn" # TODO review occurrences cast_ptr_alignment = "warn" # TODO review occurrences missing_safety_doc = "allow" # TODO review occurrences diff --git a/src/header/unistd/brk.rs b/src/header/unistd/brk.rs index c402131e3c..65d6544171 100644 --- a/src/header/unistd/brk.rs +++ b/src/header/unistd/brk.rs @@ -54,5 +54,5 @@ pub unsafe extern "C" fn sbrk(incr: intptr_t) -> *mut c_void { } } - old_brk as *mut c_void + old_brk.cast::() } diff --git a/src/header/unistd/getpass.rs b/src/header/unistd/getpass.rs index ed089946cd..8d7a55431b 100644 --- a/src/header/unistd/getpass.rs +++ b/src/header/unistd/getpass.rs @@ -20,7 +20,7 @@ fn getpass_rs(prompt: CStr, passbuff: &mut [u8]) -> Result<*mut c_char, io::Erro let mut term = termios::termios::default(); unsafe { - termios::tcgetattr(f.fd, &mut term as *mut termios::termios); + termios::tcgetattr(f.fd, &raw mut term); } let old_term = term.clone(); @@ -31,34 +31,28 @@ fn getpass_rs(prompt: CStr, passbuff: &mut [u8]) -> Result<*mut c_char, io::Erro term.c_lflag |= termios::ICANON as u32; unsafe { - termios::tcsetattr(f.fd, termios::TCSAFLUSH, &term as *const termios::termios); + termios::tcsetattr(f.fd, termios::TCSAFLUSH, &raw const term); } - f.write(&prompt.to_bytes())?; + f.write(prompt.to_bytes())?; f.flush()?; let mut len = f.read(passbuff)?; - if len > 0 { - if passbuff[len - 1] == b'\n' || passbuff.len() == len { - len -= 1; - } + if len > 0 && passbuff[len - 1] == b'\n' || passbuff.len() == len { + len -= 1; } passbuff[len] = 0; unsafe { - termios::tcsetattr( - f.fd, - termios::TCSAFLUSH, - &old_term as *const termios::termios, - ); + termios::tcsetattr(f.fd, termios::TCSAFLUSH, &raw const old_term); } f.write(b"\n")?; f.flush()?; - Ok(passbuff.as_mut_ptr() as *mut c_char) + Ok(passbuff.as_mut_ptr().cast::()) } /// See . diff --git a/src/header/unistd/mod.rs b/src/header/unistd/mod.rs index a830403895..9004fef384 100644 --- a/src/header/unistd/mod.rs +++ b/src/header/unistd/mod.rs @@ -148,11 +148,14 @@ pub extern "C" fn alarm(seconds: c_uint) -> c_uint { let mut otimer = sys_time::itimerval::default(); let errno_backup = platform::ERRNO.get(); - let secs = if unsafe { sys_time::setitimer(sys_time::ITIMER_REAL, &timer, &mut otimer) } < 0 { - 0 - } else { - otimer.it_value.tv_sec as c_uint + if otimer.it_value.tv_usec > 0 { 1 } else { 0 } - }; + let secs = + if unsafe { sys_time::setitimer(sys_time::ITIMER_REAL, &raw const timer, &raw mut otimer) } + < 0 + { + 0 + } else { + otimer.it_value.tv_sec as c_uint + if otimer.it_value.tv_usec > 0 { 1 } else { 0 } + }; platform::ERRNO.set(errno_backup); secs @@ -221,16 +224,14 @@ pub unsafe extern "C" fn confstr(name: c_int, buf: *mut c_char, len: size_t) -> #[unsafe(no_mangle)] pub unsafe extern "C" fn crypt(key: *const c_char, salt: *const c_char) -> *mut c_char { let mut data = crypt_data::new(); - unsafe { crypt_r(key, salt, &mut data as *mut _) } + unsafe { crypt_r(key, salt, &raw mut data) } } /// Non-POSIX, see . #[unsafe(no_mangle)] pub extern "C" fn daemon(nochdir: c_int, noclose: c_int) -> c_int { - if nochdir == 0 { - if Sys::chdir(c"/".into()).map(|()| 0).or_minus_one_errno() < 0 { - return -1; - } + if nochdir == 0 && Sys::chdir(c"/".into()).map(|()| 0).or_minus_one_errno() < 0 { + return -1; } if noclose == 0 { @@ -480,7 +481,7 @@ pub unsafe extern "C" fn getcwd(mut buf: *mut c_char, mut size: size_t) -> *mut .position(|b| *b == 0) .expect("no nul-byte in getcwd string") + 1; - let heap_buf = unsafe { platform::alloc(len) as *mut c_char }; + let heap_buf = unsafe { platform::alloc(len).cast::() }; for i in 0..len { unsafe { *heap_buf.add(i) = stack_buf[i]; @@ -504,7 +505,7 @@ pub extern "C" fn getdtablesize() -> c_int { let r = unsafe { sys_resource::getrlimit( sys_resource::RLIMIT_NOFILE as c_int, - lim.as_mut_ptr() as *mut sys_resource::rlimit, + lim.as_mut_ptr().cast::(), ) }; if r == 0 { @@ -597,8 +598,8 @@ pub unsafe extern "C" fn gethostname(mut name: *mut c_char, mut len: size_t) -> pub unsafe extern "C" fn getlogin() -> *mut c_char { const LOGIN_LEN: usize = 256; static mut LOGIN: [c_char; LOGIN_LEN] = [0; LOGIN_LEN]; - if getlogin_r(&raw mut LOGIN as *mut _, LOGIN_LEN) == 0 { - &raw mut LOGIN as *mut _ + if getlogin_r((&raw mut LOGIN).cast(), LOGIN_LEN) == 0 { + (&raw mut LOGIN).cast() } else { ptr::null_mut() } @@ -701,7 +702,7 @@ pub unsafe extern "C" fn getwd(path_name: *mut c_char) -> *mut c_char { #[unsafe(no_mangle)] pub extern "C" fn isatty(fd: c_int) -> c_int { let mut t = termios::termios::default(); - if unsafe { termios::tcgetattr(fd, &mut t as *mut termios::termios) == 0 } { + if unsafe { termios::tcgetattr(fd, &raw mut t) == 0 } { 1 } else { 0 @@ -739,37 +740,30 @@ pub unsafe extern "C" fn lockf(fildes: c_int, function: c_int, size: off_t) -> c match function { fcntl::F_TEST => { fl.l_type = fcntl::F_RDLCK as c_short; - if unsafe { fcntl::fcntl(fildes, fcntl::F_GETLK, &mut fl as *mut _ as c_ulonglong) } < 0 - { + if unsafe { fcntl::fcntl(fildes, fcntl::F_GETLK, &raw mut fl as c_ulonglong) } < 0 { return -1; } if fl.l_type == fcntl::F_UNLCK as c_short || fl.l_pid == getpid() { return 0; } platform::ERRNO.set(errno::EACCES); - return -1; + -1 } fcntl::F_ULOCK => { fl.l_type = fcntl::F_UNLCK as c_short; - return unsafe { - fcntl::fcntl(fildes, fcntl::F_SETLK, &mut fl as *mut _ as c_ulonglong) - }; - } - fcntl::F_TLOCK => { - return unsafe { - fcntl::fcntl(fildes, fcntl::F_SETLK, &mut fl as *mut _ as c_ulonglong) - }; - } - fcntl::F_LOCK => { - return unsafe { - fcntl::fcntl(fildes, fcntl::F_SETLKW, &mut fl as *mut _ as c_ulonglong) - }; + unsafe { fcntl::fcntl(fildes, fcntl::F_SETLK, &raw mut fl as c_ulonglong) } } + fcntl::F_TLOCK => unsafe { + fcntl::fcntl(fildes, fcntl::F_SETLK, &raw mut fl as c_ulonglong) + }, + fcntl::F_LOCK => unsafe { + fcntl::fcntl(fildes, fcntl::F_SETLKW, &raw mut fl as c_ulonglong) + }, _ => { platform::ERRNO.set(errno::EINVAL); - return -1; + -1 } - }; + } } /// See . @@ -790,7 +784,7 @@ pub unsafe extern "C" fn pause() -> c_int { let mut pset = mem::MaybeUninit::::uninit(); unsafe { sigprocmask(0, ptr::null_mut(), pset.as_mut_ptr()) }; let set = unsafe { pset.assume_init() }; - unsafe { sigsuspend(&set) } + unsafe { sigsuspend(&raw const set) } } /// See . @@ -854,7 +848,7 @@ pub unsafe extern "C" fn pwrite( /// See . #[unsafe(no_mangle)] pub unsafe extern "C" fn read(fildes: c_int, buf: *mut c_void, nbyte: size_t) -> ssize_t { - let buf = unsafe { slice::from_raw_parts_mut(buf as *mut u8, nbyte as usize) }; + let buf = unsafe { slice::from_raw_parts_mut(buf.cast::(), nbyte) }; trace_expr!( Sys::read(fildes, buf) .map(|read| read as ssize_t) @@ -874,7 +868,7 @@ pub unsafe extern "C" fn readlink( bufsize: size_t, ) -> ssize_t { let path = unsafe { CStr::from_ptr(path) }; - let buf = unsafe { slice::from_raw_parts_mut(buf as *mut u8, bufsize as usize) }; + let buf = unsafe { slice::from_raw_parts_mut(buf.cast::(), bufsize) }; Sys::readlink(path, buf) .map(|read| read as ssize_t) .or_minus_one_errno() @@ -889,8 +883,8 @@ pub unsafe extern "C" fn readlinkat( len: size_t, ) -> ssize_t { let pathname = unsafe { CStr::from_ptr(pathname) }; - let mut buf = unsafe { slice::from_raw_parts_mut(buf.cast(), len) }; - Sys::readlinkat(dirfd, pathname, &mut buf) + let buf = unsafe { slice::from_raw_parts_mut(buf.cast(), len) }; + Sys::readlinkat(dirfd, pathname, buf) .map(|read| { read.try_into() .map_err(|_| Errno(ENAMETOOLONG)) @@ -1014,7 +1008,7 @@ pub extern "C" fn sleep(seconds: c_uint) -> c_uint { // If sleep() returns because the requested time has elapsed, the value returned shall be 0. // If sleep() returns due to delivery of a signal, the return value shall be the "unslept" amount // (the requested time minus the time actually slept) in seconds. - match unsafe { Sys::nanosleep(&rqtp, &mut rmtp) } { + match unsafe { Sys::nanosleep(&raw const rqtp, &raw mut rmtp) } { Err(Errno(EINTR)) => rmtp.tv_sec as c_uint, r => 0, } @@ -1055,7 +1049,7 @@ pub extern "C" fn sync() { #[unsafe(no_mangle)] pub extern "C" fn tcgetpgrp(fd: c_int) -> pid_t { let mut pgrp = 0; - if unsafe { sys_ioctl::ioctl(fd, sys_ioctl::TIOCGPGRP, &mut pgrp as *mut pid_t as _) } < 0 { + if unsafe { sys_ioctl::ioctl(fd, sys_ioctl::TIOCGPGRP, (&raw mut pgrp).cast()) } < 0 { return -1; } pgrp @@ -1064,7 +1058,7 @@ pub extern "C" fn tcgetpgrp(fd: c_int) -> pid_t { /// See . #[unsafe(no_mangle)] pub extern "C" fn tcsetpgrp(fd: c_int, pgrp: pid_t) -> c_int { - if unsafe { sys_ioctl::ioctl(fd, sys_ioctl::TIOCSPGRP, &pgrp as *const pid_t as _) } < 0 { + if unsafe { sys_ioctl::ioctl(fd, sys_ioctl::TIOCSPGRP, &raw const pgrp as _) } < 0 { return -1; } pgrp @@ -1092,8 +1086,8 @@ pub unsafe extern "C" fn truncate(path: *const c_char, length: off_t) -> c_int { pub unsafe extern "C" fn ttyname(fildes: c_int) -> *mut c_char { const TTYNAME_LEN: usize = 4096; static mut TTYNAME: [c_char; TTYNAME_LEN] = [0; TTYNAME_LEN]; - if ttyname_r(fildes, &raw mut TTYNAME as *mut _, TTYNAME_LEN) == 0 { - &raw mut TTYNAME as *mut _ + if ttyname_r(fildes, (&raw mut TTYNAME).cast(), TTYNAME_LEN) == 0 { + (&raw mut TTYNAME).cast() } else { ptr::null_mut() } @@ -1102,7 +1096,7 @@ pub unsafe extern "C" fn ttyname(fildes: c_int) -> *mut c_char { /// See . #[unsafe(no_mangle)] pub extern "C" fn ttyname_r(fildes: c_int, name: *mut c_char, namesize: size_t) -> c_int { - let name = unsafe { slice::from_raw_parts_mut(name as *mut u8, namesize) }; + let name = unsafe { slice::from_raw_parts_mut(name.cast::(), namesize) }; if name.is_empty() { return errno::ERANGE; } @@ -1138,11 +1132,14 @@ pub extern "C" fn ualarm(usecs: useconds_t, interval: useconds_t) -> useconds_t }, }; let errno_backup = platform::ERRNO.get(); - let ret = if unsafe { sys_time::setitimer(sys_time::ITIMER_REAL, &timer, &mut timer) } < 0 { - 0 - } else { - timer.it_value.tv_sec as useconds_t * 1_000_000 + timer.it_value.tv_usec as useconds_t - }; + let ret = + if unsafe { sys_time::setitimer(sys_time::ITIMER_REAL, &raw const timer, &raw mut timer) } + < 0 + { + 0 + } else { + timer.it_value.tv_sec as useconds_t * 1_000_000 + timer.it_value.tv_usec as useconds_t + }; platform::ERRNO.set(errno_backup); ret @@ -1168,7 +1165,7 @@ pub extern "C" fn usleep(useconds: useconds_t) -> c_int { tv_nsec: ((useconds % 1_000_000) * 1000) as c_long, }; let rmtp = ptr::null_mut(); - unsafe { Sys::nanosleep(&rqtp, rmtp) } + unsafe { Sys::nanosleep(&raw const rqtp, rmtp) } .map(|()| 0) .or_minus_one_errno() } @@ -1235,7 +1232,7 @@ unsafe fn with_argv( /// See . #[unsafe(no_mangle)] pub unsafe extern "C" fn write(fildes: c_int, buf: *const c_void, nbyte: size_t) -> ssize_t { - let buf = unsafe { slice::from_raw_parts(buf as *const u8, nbyte as usize) }; + let buf = unsafe { slice::from_raw_parts(buf.cast::(), nbyte) }; Sys::write(fildes, buf) .map(|bytes| bytes as ssize_t) .or_minus_one_errno()