mkfifo: error when non-file permission mode set (#10372)

---------

Co-authored-by: Chris Dryden <christopher.paul.dryden@gmail.com>
This commit is contained in:
Fan Mo
2026-01-21 08:05:31 +01:00
committed by GitHub
co-authored by Chris Dryden
parent 0eb2ade7e2
commit 3026d0d159
4 changed files with 27 additions and 0 deletions
+1
View File
@@ -11,3 +11,4 @@ mkfifo-error-invalid-mode = invalid mode: { $error }
mkfifo-error-missing-operand = missing operand
mkfifo-error-cannot-create-fifo = cannot create fifo { $path }: File exists
mkfifo-error-cannot-set-permissions = cannot set permissions on { $path }: { $error }
mkfifo-error-non-file-permission = mode must specify only file permission bits
+1
View File
@@ -11,3 +11,4 @@ mkfifo-error-invalid-mode = mode invalide : { $error }
mkfifo-error-missing-operand = opérande manquant
mkfifo-error-cannot-create-fifo = impossible de créer le fifo { $path } : Le fichier existe
mkfifo-error-cannot-set-permissions = impossible de définir les permissions sur { $path } : { $error }
mkfifo-error-non-file-permission = le mode ne doit spécifier que des bits de permission de fichier
+9
View File
@@ -28,6 +28,15 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> {
let mode = calculate_mode(matches.get_one::<String>(options::MODE))
.map_err(|e| USimpleError::new(1, translate!("mkfifo-error-invalid-mode", "error" => e)))?;
// Check if mode contains special bits
let non_file_permission_bits = 0o7000; // setuid, setgid, sticky bits
if mode & non_file_permission_bits != 0 {
return Err(USimpleError::new(
1,
translate!("mkfifo-error-non-file-permission"),
));
}
let fifos: Vec<String> = match matches.get_many::<String>(options::FIFO) {
Some(v) => v.cloned().collect(),
None => {
+16
View File
@@ -43,6 +43,22 @@ fn test_create_one_fifo_with_invalid_mode() {
.stderr_contains("invalid mode");
}
#[test]
fn test_create_one_fifo_with_non_file_permission_mode() {
new_ucmd!()
.arg("abcd")
.arg("-m")
.arg("1777")
.fails()
.stderr_is("mkfifo: mode must specify only file permission bits\n");
new_ucmd!()
.arg("abcd")
.arg("-m")
.arg("1999")
.fails()
.stderr_contains("invalid mode");
}
#[test]
fn test_create_multiple_fifos() {
new_ucmd!()