From 5ac09433262095470f39fc5ea318ea9411923a06 Mon Sep 17 00:00:00 2001 From: Dominik George <dominik.george@teckids.org> Date: Tue, 11 May 2021 20:02:52 +0200 Subject: [PATCH] Fix NullPointerException for getpwnam/getuid structs on unknown users --- src/cache.rs | 10 +++++++++- src/nss.rs | 13 +++++++++++-- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/cache.rs b/src/cache.rs index f5fa9d9..040ec37 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 9d76fce..9588e03 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() } -- GitLab