diff --git a/src/uu/mkfifo/locales/en-US.ftl b/src/uu/mkfifo/locales/en-US.ftl index 2a02e7d0d..c6dcae831 100644 --- a/src/uu/mkfifo/locales/en-US.ftl +++ b/src/uu/mkfifo/locales/en-US.ftl @@ -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 diff --git a/src/uu/mkfifo/locales/fr-FR.ftl b/src/uu/mkfifo/locales/fr-FR.ftl index d47722463..14cfc6dd5 100644 --- a/src/uu/mkfifo/locales/fr-FR.ftl +++ b/src/uu/mkfifo/locales/fr-FR.ftl @@ -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 diff --git a/src/uu/mkfifo/src/mkfifo.rs b/src/uu/mkfifo/src/mkfifo.rs index 607b8a9aa..82c5ec1c6 100644 --- a/src/uu/mkfifo/src/mkfifo.rs +++ b/src/uu/mkfifo/src/mkfifo.rs @@ -28,6 +28,15 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { let mode = calculate_mode(matches.get_one::(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 = match matches.get_many::(options::FIFO) { Some(v) => v.cloned().collect(), None => { diff --git a/tests/by-util/test_mkfifo.rs b/tests/by-util/test_mkfifo.rs index 35869fe5d..4d19da636 100644 --- a/tests/by-util/test_mkfifo.rs +++ b/tests/by-util/test_mkfifo.rs @@ -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!()