feat: enhance command classification and error handling; improve process checks and credential security
This commit is contained in:
@@ -52,12 +52,34 @@ impl SessionLock {
|
||||
let _ = fs::remove_file(&self.path);
|
||||
}
|
||||
|
||||
/// Check whether a process with the given PID is currently alive.
|
||||
/// Check whether a process with the given PID is currently alive and
|
||||
/// is actually a zesdex process (not a recycled PID from a different
|
||||
/// program).
|
||||
fn is_alive(&self, pid: u32) -> bool {
|
||||
// SAFETY: `libc::kill(pid, 0)` does not send a signal; it only checks
|
||||
// whether the process exists and the caller has permission to signal
|
||||
// it. The integer argument is a PID already validated by `try_lock`.
|
||||
unsafe { libc::kill(pid as i32, 0) == 0 }
|
||||
if unsafe { libc::kill(pid as i32, 0) != 0 } {
|
||||
return false;
|
||||
}
|
||||
// Extra check: verify the PID belongs to a zesdex process via
|
||||
// /proc/<pid>/exe to mitigate the PID-reuse race (a recycled PID
|
||||
// from a different program would answer kill but shouldn't hold
|
||||
// our lock). This is best-effort — /proc may not be available
|
||||
// on all platforms.
|
||||
let proc_exe = std::path::PathBuf::from(format!("/proc/{}/exe", pid));
|
||||
match std::fs::read_link(&proc_exe) {
|
||||
Ok(target) => match std::env::current_exe() {
|
||||
Ok(exe) => {
|
||||
if target != exe {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
Err(_) => { /* cannot resolve own exe, trust kill check */ }
|
||||
},
|
||||
Err(_) => { /* /proc unavailable, trust kill check */ }
|
||||
}
|
||||
true
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user