From bf2b2df9c9e218e35e5a38ce3d03cffb7c363956 Mon Sep 17 00:00:00 2001 From: David Peter Date: Mon, 12 Jul 2021 20:03:31 +0200 Subject: [PATCH] Fix for Windows: do not run binaries from CWD This fixes a bug on Windows where `Command::new` would also run executables from the current working directory, possibly resulting in accidental runs of programs called `less`. --- Cargo.lock | 29 +++++++++++++++++++++++++++++ Cargo.toml | 1 + src/less.rs | 4 +++- src/output.rs | 9 ++++++++- 4 files changed, 41 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index a6d2d33f..6170e94c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "adler" version = "1.0.2" @@ -97,6 +99,7 @@ dependencies = [ "error-chain", "git2", "globset", + "grep-cli", "lazy_static", "nix", "path_abs", @@ -487,6 +490,23 @@ dependencies = [ "regex", ] +[[package]] +name = "grep-cli" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dd110c34bb4460d0de5062413b773e385cbf8a85a63fc535590110a09e79e8a" +dependencies = [ + "atty", + "bstr", + "globset", + "lazy_static", + "log", + "regex", + "same-file", + "termcolor", + "winapi-util", +] + [[package]] name = "hashbrown" version = "0.9.1" @@ -1143,6 +1163,15 @@ dependencies = [ "winapi", ] +[[package]] +name = "termcolor" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dfed899f0eb03f32ee8c6a0aabdb8a7949659e3466561fc0adf54e26d88c5f4" +dependencies = [ + "winapi-util", +] + [[package]] name = "terminal_size" version = "0.1.16" diff --git a/Cargo.toml b/Cargo.toml index 42a9f50f..e9b99b68 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -51,6 +51,7 @@ path_abs = { version = "0.5", default-features = false } clircle = "0.3" bugreport = "0.4" dirs-next = { version = "2.0.0", optional = true } +grep-cli = "0.1.6" [dependencies.git2] version = "0.13" diff --git a/src/less.rs b/src/less.rs index f1adca81..2575fe18 100644 --- a/src/less.rs +++ b/src/less.rs @@ -4,7 +4,9 @@ use std::ffi::OsStr; use std::process::Command; pub fn retrieve_less_version(less_path: &dyn AsRef) -> Option { - let cmd = Command::new(less_path).arg("--version").output().ok()?; + let resolved_path = grep_cli::resolve_binary(less_path.as_ref()).ok()?; + + let cmd = Command::new(resolved_path).arg("--version").output().ok()?; parse_less_version(&cmd.stdout) } diff --git a/src/output.rs b/src/output.rs index 4aff7686..8bc2da0c 100644 --- a/src/output.rs +++ b/src/output.rs @@ -63,7 +63,14 @@ impl OutputType { return Err(ErrorKind::InvalidPagerValueBat.into()); } - let mut p = Command::new(&pager.bin); + let resolved_path = match grep_cli::resolve_binary(&pager.bin) { + Ok(path) => path, + Err(_) => { + return Ok(OutputType::stdout()); + } + }; + + let mut p = Command::new(resolved_path); let args = pager.args; if pager.kind == PagerKind::Less {