Disallow running CLI with root privileges (#32583)
In #31331, I made a change that prevents Zed from running with root privileges, but I forgot about the CLI. So if you run the CLI without the `--foreground` flag, it just freezes without any messages. This PR fixes that. Release Notes: - N/A
This commit is contained in:
parent
3fb28f695f
commit
628f91dd96
6 changed files with 29 additions and 17 deletions
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -17348,6 +17348,7 @@ dependencies = [
|
||||||
"itertools 0.14.0",
|
"itertools 0.14.0",
|
||||||
"libc",
|
"libc",
|
||||||
"log",
|
"log",
|
||||||
|
"nix 0.29.0",
|
||||||
"rand 0.8.5",
|
"rand 0.8.5",
|
||||||
"regex",
|
"regex",
|
||||||
"rust-embed",
|
"rust-embed",
|
||||||
|
|
|
@ -127,6 +127,9 @@ fn parse_path_with_position(argument_str: &str) -> anyhow::Result<String> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() -> Result<()> {
|
fn main() -> Result<()> {
|
||||||
|
#[cfg(unix)]
|
||||||
|
util::prevent_root_execution();
|
||||||
|
|
||||||
// Exit flatpak sandbox if needed
|
// Exit flatpak sandbox if needed
|
||||||
#[cfg(any(target_os = "linux", target_os = "freebsd"))]
|
#[cfg(any(target_os = "linux", target_os = "freebsd"))]
|
||||||
{
|
{
|
||||||
|
|
|
@ -45,6 +45,7 @@ workspace-hack.workspace = true
|
||||||
[target.'cfg(unix)'.dependencies]
|
[target.'cfg(unix)'.dependencies]
|
||||||
command-fds = "0.3.1"
|
command-fds = "0.3.1"
|
||||||
libc.workspace = true
|
libc.workspace = true
|
||||||
|
nix = { workspace = true, features = ["user"] }
|
||||||
|
|
||||||
[target.'cfg(windows)'.dependencies]
|
[target.'cfg(windows)'.dependencies]
|
||||||
tendril = "0.4.3"
|
tendril = "0.4.3"
|
||||||
|
|
|
@ -213,6 +213,28 @@ where
|
||||||
items.sort_by(compare);
|
items.sort_by(compare);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Prevents execution of the application with root privileges on Unix systems.
|
||||||
|
///
|
||||||
|
/// This function checks if the current process is running with root privileges
|
||||||
|
/// and terminates the program with an error message unless explicitly allowed via the
|
||||||
|
/// `ZED_ALLOW_ROOT` environment variable.
|
||||||
|
#[cfg(unix)]
|
||||||
|
pub fn prevent_root_execution() {
|
||||||
|
let is_root = nix::unistd::geteuid().is_root();
|
||||||
|
let allow_root = std::env::var("ZED_ALLOW_ROOT").is_ok_and(|val| val == "true");
|
||||||
|
|
||||||
|
if is_root && !allow_root {
|
||||||
|
eprintln!(
|
||||||
|
"\
|
||||||
|
Error: Running Zed as root or via sudo is unsupported.
|
||||||
|
Doing so (even once) may subtly break things for all subsequent non-root usage of Zed.
|
||||||
|
It is untested and not recommended, don't complain when things break.
|
||||||
|
If you wish to proceed anyways, set `ZED_ALLOW_ROOT=true` in your environment."
|
||||||
|
);
|
||||||
|
std::process::exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(unix)]
|
#[cfg(unix)]
|
||||||
fn load_shell_from_passwd() -> Result<()> {
|
fn load_shell_from_passwd() -> Result<()> {
|
||||||
let buflen = match unsafe { libc::sysconf(libc::_SC_GETPW_R_SIZE_MAX) } {
|
let buflen = match unsafe { libc::sysconf(libc::_SC_GETPW_R_SIZE_MAX) } {
|
||||||
|
|
|
@ -88,7 +88,7 @@ markdown_preview.workspace = true
|
||||||
menu.workspace = true
|
menu.workspace = true
|
||||||
migrator.workspace = true
|
migrator.workspace = true
|
||||||
mimalloc = { version = "0.1", optional = true }
|
mimalloc = { version = "0.1", optional = true }
|
||||||
nix = { workspace = true, features = ["pthread", "signal", "user"] }
|
nix = { workspace = true, features = ["pthread", "signal"] }
|
||||||
node_runtime.workspace = true
|
node_runtime.workspace = true
|
||||||
notifications.workspace = true
|
notifications.workspace = true
|
||||||
outline.workspace = true
|
outline.workspace = true
|
||||||
|
|
|
@ -162,22 +162,7 @@ fn fail_to_open_window(e: anyhow::Error, _cx: &mut App) {
|
||||||
|
|
||||||
pub fn main() {
|
pub fn main() {
|
||||||
#[cfg(unix)]
|
#[cfg(unix)]
|
||||||
{
|
util::prevent_root_execution();
|
||||||
let is_root = nix::unistd::geteuid().is_root();
|
|
||||||
let allow_root = env::var("ZED_ALLOW_ROOT").is_ok_and(|val| val == "true");
|
|
||||||
|
|
||||||
// Prevent running Zed with root privileges on Unix systems unless explicitly allowed
|
|
||||||
if is_root && !allow_root {
|
|
||||||
eprintln!(
|
|
||||||
"\
|
|
||||||
Error: Running Zed as root or via sudo is unsupported.
|
|
||||||
Doing so (even once) may subtly break things for all subsequent non-root usage of Zed.
|
|
||||||
It is untested and not recommended, don't complain when things break.
|
|
||||||
If you wish to proceed anyways, set `ZED_ALLOW_ROOT=true` in your environment."
|
|
||||||
);
|
|
||||||
process::exit(1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if there is a pending installer
|
// Check if there is a pending installer
|
||||||
// If there is, run the installer and exit
|
// If there is, run the installer and exit
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue