diff --git a/src/uu/more/src/more.rs b/src/uu/more/src/more.rs index 64683a1be..8c6cdf6e2 100644 --- a/src/uu/more/src/more.rs +++ b/src/uu/more/src/more.rs @@ -104,7 +104,17 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { if length > 1 { buff.push_str(&MULTI_FILE_TOP_PROMPT.replace("{}", file.to_str().unwrap())); } - let mut reader = BufReader::new(File::open(file).unwrap()); + let opened_file = match File::open(file) { + Err(why) => { + terminal::disable_raw_mode().unwrap(); + return Err(USimpleError::new( + 1, + format!("cannot open {}: {}", file.quote(), why.kind()), + )); + } + Ok(opened_file) => opened_file, + }; + let mut reader = BufReader::new(opened_file); reader.read_to_string(&mut buff).unwrap(); more(&buff, &mut stdout, next_file.copied(), &options)?; buff.clear(); diff --git a/tests/by-util/test_more.rs b/tests/by-util/test_more.rs index cb12343fa..97353deb8 100644 --- a/tests/by-util/test_more.rs +++ b/tests/by-util/test_more.rs @@ -32,3 +32,21 @@ fn test_more_dir_arg() { .usage_error("'.' is a directory."); } } + +#[test] +#[cfg(target_family = "unix")] +fn test_more_invalid_file_perms() { + use std::fs::{set_permissions, Permissions}; + use std::os::unix::fs::PermissionsExt; + + if std::io::stdout().is_terminal() { + let (at, mut ucmd) = at_and_ucmd!(); + let permissions = Permissions::from_mode(0o244); + at.make_file("invalid-perms.txt"); + set_permissions(at.plus("invalid-perms.txt"), permissions).unwrap(); + ucmd.arg("invalid-perms.txt") + .fails() + .code_is(1) + .stderr_contains("permission denied"); + } +}