diff --git a/src/header/unistd/getpass.rs b/src/header/unistd/getpass.rs index da54c3d3178551280562aaf769e41401fd07f404..6776cad85be6042f5282f6700b58afd9e798e0f9 100644 --- a/src/header/unistd/getpass.rs +++ b/src/header/unistd/getpass.rs @@ -13,7 +13,7 @@ use crate::{ use crate::platform::types::*; -fn getpass_rs(prompt: CStr, passbuff: &mut [c_char]) -> Result<*mut c_char, io::Error> { +fn getpass_rs(prompt: CStr, passbuff: &mut [u8]) -> Result<*mut c_char, io::Error> { let mut f = File::open(c_str!("/dev/tty"), O_RDWR | O_CLOEXEC)?; let mut term = termios::termios::default(); @@ -34,12 +34,12 @@ fn getpass_rs(prompt: CStr, passbuff: &mut [c_char]) -> Result<*mut c_char, io:: } f.write(&prompt.to_bytes())?; + f.flush()?; - let buff = unsafe { &mut *(passbuff as *mut [i8] as *mut [u8]) }; - let mut len = f.read(buff)?; + let mut len = f.read(passbuff)?; if len > 0 { - if passbuff[len - 1] == b'\n' as c_char || passbuff.len() == len { + if passbuff[len - 1] == b'\n' || passbuff.len() == len { len -= 1; } } @@ -55,13 +55,14 @@ fn getpass_rs(prompt: CStr, passbuff: &mut [c_char]) -> Result<*mut c_char, io:: } f.write(b"\n")?; + f.flush()?; - Ok(passbuff.as_mut_ptr()) + Ok(passbuff.as_mut_ptr() as *mut c_char) } #[no_mangle] pub unsafe extern "C" fn getpass(prompt: *const c_char) -> *mut c_char { - static mut PASSBUFF: [c_char; PASS_MAX] = [0; PASS_MAX]; + static mut PASSBUFF: [u8; PASS_MAX] = [0; PASS_MAX]; unsafe { getpass_rs(CStr::from_ptr(prompt), &mut PASSBUFF).unwrap_or(ptr::null_mut()) } }