From 557f1befb44cc363bdae5fd92cae9c19ebe0b33a Mon Sep 17 00:00:00 2001 From: Christopher Dryden Date: Tue, 6 Jan 2026 18:39:44 +0000 Subject: [PATCH] smack: refactor to single set_smack_label_and_cleanup function --- src/uu/mkdir/src/mkdir.rs | 4 +++- src/uu/mkfifo/src/mkfifo.rs | 4 +++- src/uu/mknod/src/mknod.rs | 6 +++++- src/uucore/src/lib/features/smack.rs | 23 ++++------------------- 4 files changed, 15 insertions(+), 22 deletions(-) diff --git a/src/uu/mkdir/src/mkdir.rs b/src/uu/mkdir/src/mkdir.rs index 4b02b6d8a..88a196ebb 100644 --- a/src/uu/mkdir/src/mkdir.rs +++ b/src/uu/mkdir/src/mkdir.rs @@ -303,7 +303,9 @@ fn create_single_dir(path: &Path, is_parent: bool, config: &Config) -> UResult<( // Apply SMACK context if requested #[cfg(feature = "smack")] if config.set_security_context { - uucore::smack::set_smack_label_for_new_dir(path, config.context)?; + uucore::smack::set_smack_label_and_cleanup(path, config.context, |p| { + std::fs::remove_dir(p) + })?; } Ok(()) } diff --git a/src/uu/mkfifo/src/mkfifo.rs b/src/uu/mkfifo/src/mkfifo.rs index c9f1588d2..225540873 100644 --- a/src/uu/mkfifo/src/mkfifo.rs +++ b/src/uu/mkfifo/src/mkfifo.rs @@ -82,7 +82,9 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> { let set_security_context = matches.get_flag(options::SECURITY_CONTEXT); let context = matches.get_one::(options::CONTEXT); if set_security_context || context.is_some() { - uucore::smack::set_smack_label_for_new_file(&f, context)?; + uucore::smack::set_smack_label_and_cleanup(&f, context, |p| { + std::fs::remove_file(p) + })?; } } } diff --git a/src/uu/mknod/src/mknod.rs b/src/uu/mknod/src/mknod.rs index 6bc0ea2ca..56474e4b6 100644 --- a/src/uu/mknod/src/mknod.rs +++ b/src/uu/mknod/src/mknod.rs @@ -103,7 +103,11 @@ fn mknod(file_name: &str, config: Config) -> i32 { // Apply SMACK context if requested #[cfg(feature = "smack")] if config.set_security_context { - if let Err(e) = uucore::smack::set_smack_label_for_new_file(file_name, config.context) { + if let Err(e) = + uucore::smack::set_smack_label_and_cleanup(file_name, config.context, |p| { + std::fs::remove_file(p) + }) + { eprintln!("{}: {}", uucore::util_name(), e); return 1; } diff --git a/src/uucore/src/lib/features/smack.rs b/src/uucore/src/lib/features/smack.rs index 1b619211d..d901bde00 100644 --- a/src/uucore/src/lib/features/smack.rs +++ b/src/uucore/src/lib/features/smack.rs @@ -103,10 +103,11 @@ pub fn set_smack_label_for_path(path: &Path, label: &str) -> Result<(), SmackErr .map_err(|e| SmackError::LabelSetFailure(label.to_string(), e)) } -/// Sets SMACK label for a file, removing it on failure. -pub fn set_smack_label_for_new_file( +/// Sets SMACK label for a new path, calling cleanup on failure. +pub fn set_smack_label_and_cleanup( path: impl AsRef, context: Option<&String>, + cleanup: impl FnOnce(&Path) -> io::Result<()>, ) -> Result<(), Box> { let Some(ctx) = context else { return Ok(()) }; if !is_smack_enabled() { @@ -114,23 +115,7 @@ pub fn set_smack_label_for_new_file( } let path = path.as_ref(); set_smack_label_for_path(path, ctx).map_err(|e| { - let _ = fs::remove_file(path); - USimpleError::new(1, e.to_string()) - }) -} - -/// Sets SMACK label for a directory, removing it on failure. -pub fn set_smack_label_for_new_dir( - path: impl AsRef, - context: Option<&String>, -) -> Result<(), Box> { - let Some(ctx) = context else { return Ok(()) }; - if !is_smack_enabled() { - return Ok(()); - } - let path = path.as_ref(); - set_smack_label_for_path(path, ctx).map_err(|e| { - let _ = fs::remove_dir(path); + let _ = cleanup(path); USimpleError::new(1, e.to_string()) }) }