From abf963e707d499cb328bd084facf1cd12c98c2a5 Mon Sep 17 00:00:00 2001 From: Chaganti-Reddy Date: Wed, 8 Jul 2026 14:50:37 +0530 Subject: [PATCH] mkfifo: don't delete fifo and fail when --context is used without SELinux/SMACK. Fixes #12983 --- src/uu/mkfifo/locales/en-US.ftl | 3 +++ src/uu/mkfifo/locales/fr-FR.ftl | 3 +++ src/uu/mkfifo/src/mkfifo.rs | 10 ++++++++-- tests/by-util/test_mkfifo.rs | 25 +++++++++++++++++++++++++ 4 files changed, 39 insertions(+), 2 deletions(-) diff --git a/src/uu/mkfifo/locales/en-US.ftl b/src/uu/mkfifo/locales/en-US.ftl index c6dcae83180..e4836cab620 100644 --- a/src/uu/mkfifo/locales/en-US.ftl +++ b/src/uu/mkfifo/locales/en-US.ftl @@ -12,3 +12,6 @@ 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 + +# Warning messages +mkfifo-warning-context-not-selinux = ignoring --context; it requires an SELinux/SMACK-enabled kernel diff --git a/src/uu/mkfifo/locales/fr-FR.ftl b/src/uu/mkfifo/locales/fr-FR.ftl index 14cfc6dd582..90e024da0fd 100644 --- a/src/uu/mkfifo/locales/fr-FR.ftl +++ b/src/uu/mkfifo/locales/fr-FR.ftl @@ -12,3 +12,6 @@ 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 + +# Messages d'avertissement +mkfifo-warning-context-not-selinux = --context est ignoré ; cela nécessite un noyau avec SELinux/SMACK activé diff --git a/src/uu/mkfifo/src/mkfifo.rs b/src/uu/mkfifo/src/mkfifo.rs index 46898ade7b6..bdbaf4cded0 100644 --- a/src/uu/mkfifo/src/mkfifo.rs +++ b/src/uu/mkfifo/src/mkfifo.rs @@ -10,6 +10,8 @@ use uucore::display::Quotable; use uucore::error::{UResult, USimpleError}; use uucore::translate; +#[cfg(all(feature = "selinux", any(target_os = "linux", target_os = "android")))] +use uucore::show_warning; use uucore::{format_usage, show}; mod options { @@ -72,8 +74,12 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { if let Err(e) = uucore::selinux::set_selinux_security_context(Path::new(&f), context) { - let _ = std::fs::remove_file(f); - return Err(USimpleError::new(1, e.to_string())); + if matches!(e, uucore::selinux::SeLinuxError::SELinuxNotEnabled) { + show_warning!("{}", translate!("mkfifo-warning-context-not-selinux")); + } else { + let _ = std::fs::remove_file(f); + return Err(USimpleError::new(1, e.to_string())); + } } } } diff --git a/tests/by-util/test_mkfifo.rs b/tests/by-util/test_mkfifo.rs index 02fa91b2a52..ceb550475cb 100644 --- a/tests/by-util/test_mkfifo.rs +++ b/tests/by-util/test_mkfifo.rs @@ -223,6 +223,31 @@ fn test_mkfifo_selinux_invalid() { } } +#[test] +#[cfg(all( + feature = "feat_selinux", + any(target_os = "linux", target_os = "android") +))] +fn test_mkfifo_context_warns_when_kernel_not_enabled() { + if uucore::selinux::is_selinux_enabled() { + return; + } + + let scene = TestScenario::new(util_name!()); + let at = &scene.fixtures; + let dest = "test_fifo_context_warning"; + + scene + .ucmd() + .arg("--context=unconfined_u:object_r:user_tmp_t:s0") + .arg(dest) + .succeeds() + .no_stdout() + .stderr_contains("ignoring --context"); + + assert!(at.is_fifo(dest)); +} + #[test] fn test_mkfifo_permission_unchanged_when_failed() { use uucore::fs::display_permissions;