From 0370332eb405dbcf913dd3d613d5d233fbfad9f5 Mon Sep 17 00:00:00 2001 From: Greg Kroah-Hartman Date: Sat, 10 Sep 2022 08:26:38 +0200 Subject: [PATCH] 4.19-stable patches added patches: debugfs-add-debugfs_lookup_and_remove.patch --- ...ebugfs-add-debugfs_lookup_and_remove.patch | 79 +++++++++++++++++++ queue-4.19/series | 1 + 2 files changed, 80 insertions(+) create mode 100644 queue-4.19/debugfs-add-debugfs_lookup_and_remove.patch diff --git a/queue-4.19/debugfs-add-debugfs_lookup_and_remove.patch b/queue-4.19/debugfs-add-debugfs_lookup_and_remove.patch new file mode 100644 index 00000000000..d309216d74b --- /dev/null +++ b/queue-4.19/debugfs-add-debugfs_lookup_and_remove.patch @@ -0,0 +1,79 @@ +From dec9b2f1e0455a151a7293c367da22ab973f713e Mon Sep 17 00:00:00 2001 +From: Greg Kroah-Hartman +Date: Fri, 2 Sep 2022 16:59:15 +0200 +Subject: debugfs: add debugfs_lookup_and_remove() + +From: Greg Kroah-Hartman + +commit dec9b2f1e0455a151a7293c367da22ab973f713e upstream. + +There is a very common pattern of using +debugfs_remove(debufs_lookup(..)) which results in a dentry leak of the +dentry that was looked up. Instead of having to open-code the correct +pattern of calling dput() on the dentry, create +debugfs_lookup_and_remove() to handle this pattern automatically and +properly without any memory leaks. + +Cc: stable +Reported-by: Kuyo Chang +Tested-by: Kuyo Chang +Link: https://lore.kernel.org/r/YxIaQ8cSinDR881k@kroah.com +Signed-off-by: Greg Kroah-Hartman +--- + fs/debugfs/inode.c | 22 ++++++++++++++++++++++ + include/linux/debugfs.h | 6 ++++++ + 2 files changed, 28 insertions(+) + +--- a/fs/debugfs/inode.c ++++ b/fs/debugfs/inode.c +@@ -767,6 +767,28 @@ void debugfs_remove_recursive(struct den + EXPORT_SYMBOL_GPL(debugfs_remove_recursive); + + /** ++ * debugfs_lookup_and_remove - lookup a directory or file and recursively remove it ++ * @name: a pointer to a string containing the name of the item to look up. ++ * @parent: a pointer to the parent dentry of the item. ++ * ++ * This is the equlivant of doing something like ++ * debugfs_remove(debugfs_lookup(..)) but with the proper reference counting ++ * handled for the directory being looked up. ++ */ ++void debugfs_lookup_and_remove(const char *name, struct dentry *parent) ++{ ++ struct dentry *dentry; ++ ++ dentry = debugfs_lookup(name, parent); ++ if (!dentry) ++ return; ++ ++ debugfs_remove(dentry); ++ dput(dentry); ++} ++EXPORT_SYMBOL_GPL(debugfs_lookup_and_remove); ++ ++/** + * debugfs_rename - rename a file/directory in the debugfs filesystem + * @old_dir: a pointer to the parent dentry for the renamed object. This + * should be a directory dentry. +--- a/include/linux/debugfs.h ++++ b/include/linux/debugfs.h +@@ -85,6 +85,8 @@ struct dentry *debugfs_create_automount( + void debugfs_remove(struct dentry *dentry); + void debugfs_remove_recursive(struct dentry *dentry); + ++void debugfs_lookup_and_remove(const char *name, struct dentry *parent); ++ + const struct file_operations *debugfs_real_fops(const struct file *filp); + + int debugfs_file_get(struct dentry *dentry); +@@ -217,6 +219,10 @@ static inline void debugfs_remove(struct + static inline void debugfs_remove_recursive(struct dentry *dentry) + { } + ++static inline void debugfs_lookup_and_remove(const char *name, ++ struct dentry *parent) ++{ } ++ + const struct file_operations *debugfs_real_fops(const struct file *filp); + + static inline int debugfs_file_get(struct dentry *dentry) diff --git a/queue-4.19/series b/queue-4.19/series index afa0de4678c..237253ff46c 100644 --- a/queue-4.19/series +++ b/queue-4.19/series @@ -59,3 +59,4 @@ alsa-emu10k1-fix-out-of-bounds-access-in-snd_emu10k1_pcm_channel_alloc.patch alsa-aloop-fix-random-zeros-in-capture-data-when-using-jiffies-timer.patch alsa-usb-audio-fix-an-out-of-bounds-bug-in-__snd_usb_parse_audio_interface.patch kprobes-prohibit-probes-in-gate-area.patch +debugfs-add-debugfs_lookup_and_remove.patch -- 2.47.3