]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
lsm: add new securityfs delete function
authorFan Wu <wufan@linux.microsoft.com>
Sat, 3 Aug 2024 06:08:21 +0000 (23:08 -0700)
committerPaul Moore <paul@paul-moore.com>
Tue, 20 Aug 2024 18:02:06 +0000 (14:02 -0400)
When deleting a directory in the security file system, the existing
securityfs_remove requires the directory to be empty, otherwise
it will do nothing. This leads to a potential risk that the security
file system might be in an unclean state when the intended deletion
did not happen.

This commit introduces a new function securityfs_recursive_remove
to recursively delete a directory without leaving an unclean state.

Co-developed-by: Christian Brauner (Microsoft) <brauner@kernel.org>
Signed-off-by: Fan Wu <wufan@linux.microsoft.com>
[PM: subject line tweak]
Signed-off-by: Paul Moore <paul@paul-moore.com>
include/linux/security.h
security/inode.c

index 3298855abdbce3ea46c0f51def3ce212d5a9cf37..f6d2bc69cfa6b081f5b782887eebcc87319fc126 100644 (file)
@@ -2090,6 +2090,7 @@ struct dentry *securityfs_create_symlink(const char *name,
                                         const char *target,
                                         const struct inode_operations *iops);
 extern void securityfs_remove(struct dentry *dentry);
+extern void securityfs_recursive_remove(struct dentry *dentry);
 
 #else /* CONFIG_SECURITYFS */
 
index 9e7cde9136677492b6ed31d9360db110c81236e7..f21847badb7d8ee8c4e790a363f241b27b29d1c2 100644 (file)
@@ -313,6 +313,31 @@ void securityfs_remove(struct dentry *dentry)
 }
 EXPORT_SYMBOL_GPL(securityfs_remove);
 
+static void remove_one(struct dentry *victim)
+{
+       simple_release_fs(&mount, &mount_count);
+}
+
+/**
+ * securityfs_recursive_remove - recursively removes a file or directory
+ *
+ * @dentry: a pointer to a the dentry of the file or directory to be removed.
+ *
+ * This function recursively removes a file or directory in securityfs that was
+ * previously created with a call to another securityfs function (like
+ * securityfs_create_file() or variants thereof.)
+ */
+void securityfs_recursive_remove(struct dentry *dentry)
+{
+       if (IS_ERR_OR_NULL(dentry))
+               return;
+
+       simple_pin_fs(&fs_type, &mount, &mount_count);
+       simple_recursive_removal(dentry, remove_one);
+       simple_release_fs(&mount, &mount_count);
+}
+EXPORT_SYMBOL_GPL(securityfs_recursive_remove);
+
 #ifdef CONFIG_SECURITY
 static struct dentry *lsm_dentry;
 static ssize_t lsm_read(struct file *filp, char __user *buf, size_t count,