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