diff --git a/src/cache.rs b/src/cache.rs index b12bc6cc3a7e8e9290b4f05387331e7c2336b066..81f603ed1adcb2acc2eaf46690f3b4b8488bb998 100644 --- a/src/cache.rs +++ b/src/cache.rs @@ -54,6 +54,11 @@ impl Cache { } fn drop_privileges(&self, username: &String) -> Result<uid_t, &str> { + let current_euid; + unsafe { + current_euid = geteuid(); + }; + let nam = match CString::new(username.as_str()) { Ok(nam) => nam, Err(_) => return Err("Invalid username in lookup") @@ -63,7 +68,7 @@ impl Cache { target_euid = (*getpwnam(nam.as_ptr())).pw_uid; }; - if target_euid == self.original_euid { + if target_euid == current_euid { debug!("No need to drop privileges, already running as {}", username); return Ok(self.original_euid); } else if self.original_euid == 0 { @@ -85,9 +90,18 @@ impl Cache { } fn restore_privileges(&self) { - debug!("Restoring privileges"); + let current_euid; unsafe { - seteuid(self.original_euid); + current_euid = geteuid(); + }; + + if current_euid != self.original_euid { + debug!("Restoring privileges"); + unsafe { + seteuid(self.original_euid); + }; + } else { + debug!("No need to restore privileges, already running as original user"); } }