summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorAlan Stern <stern@rowland.harvard.edu>2024-03-13 17:43:41 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2024-04-11 15:16:48 +0200
commita90bca2228c0646fc29a72689d308e5fe03e6d78 (patch)
tree0f95d4f14671faac649fe0c27c413042e15616dd /fs
parent4cece764965020c22cff7665b18a012006359095 (diff)
downloadlinux-stable-a90bca2228c0646fc29a72689d308e5fe03e6d78.tar.gz
linux-stable-a90bca2228c0646fc29a72689d308e5fe03e6d78.tar.bz2
linux-stable-a90bca2228c0646fc29a72689d308e5fe03e6d78.zip
fs: sysfs: Fix reference leak in sysfs_break_active_protection()
The sysfs_break_active_protection() routine has an obvious reference leak in its error path. If the call to kernfs_find_and_get() fails then kn will be NULL, so the companion sysfs_unbreak_active_protection() routine won't get called (and would only cause an access violation by trying to dereference kn->parent if it was called). As a result, the reference to kobj acquired at the start of the function will never be released. Fix the leak by adding an explicit kobject_put() call when kn is NULL. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> Fixes: 2afc9166f79b ("scsi: sysfs: Introduce sysfs_{un,}break_active_protection()") Cc: Bart Van Assche <bvanassche@acm.org> Cc: stable@vger.kernel.org Reviewed-by: Bart Van Assche <bvanassche@acm.org> Acked-by: Tejun Heo <tj@kernel.org> Link: https://lore.kernel.org/r/8a4d3f0f-c5e3-4b70-a188-0ca433f9e6f9@rowland.harvard.edu Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'fs')
-rw-r--r--fs/sysfs/file.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/fs/sysfs/file.c b/fs/sysfs/file.c
index 6b7652fb8050..7cd64021d453 100644
--- a/fs/sysfs/file.c
+++ b/fs/sysfs/file.c
@@ -463,6 +463,8 @@ struct kernfs_node *sysfs_break_active_protection(struct kobject *kobj,
kn = kernfs_find_and_get(kobj->sd, attr->name);
if (kn)
kernfs_break_active_protection(kn);
+ else
+ kobject_put(kobj);
return kn;
}
EXPORT_SYMBOL_GPL(sysfs_break_active_protection);