diff --git a/src/cache.rs b/src/cache.rs index f5fa9d9c33a002c8c1a28912505c3f05497c8df7..040ec373d0a66e5b19ad85dbf5eae3f51b1f69a4 100644 --- a/src/cache.rs +++ b/src/cache.rs @@ -63,9 +63,17 @@ impl Cache { Ok(nam) => nam, Err(_) => return Err("Invalid username in lookup") }; + let pw; + unsafe { + pw = getpwnam(nam.as_ptr()); + }; + if pw.is_null() { + error!("Failed to lookup user {}", username); + return Err("Failed to lookup user"); + } let target_euid; unsafe { - target_euid = (*getpwnam(nam.as_ptr())).pw_uid; + target_euid = (*pw).pw_uid; }; if target_euid == current_euid { diff --git a/src/nss.rs b/src/nss.rs index 9d76fce74cc68f4a33a6816f89093e778acabaad..9588e033f6745a656f316c1495aa0ccee7682f2b 100644 --- a/src/nss.rs +++ b/src/nss.rs @@ -59,10 +59,19 @@ fn nss_hook_prepare() -> Config { fn get_current_user() -> String { let euid; - let euser; + let pw; unsafe { euid = geteuid(); - euser = CStr::from_ptr((*getpwuid(euid)).pw_name); + pw = getpwuid(euid); + }; + if pw.is_null() { + error!("Failed to look up user name for UID {}", euid); + return "nobody".to_string(); + } + + let euser; + unsafe { + euser = CStr::from_ptr((*pw).pw_name); }; euser.to_str().ok().unwrap().to_string() }