Patch "driver core: class: Fix wild pointer dereferences in API class_dev_iter_next()" has been added to the 6.13-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    driver core: class: Fix wild pointer dereferences in API class_dev_iter_next()

to the 6.13-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     driver-core-class-fix-wild-pointer-dereferences-in-a.patch
and it can be found in the queue-6.13 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 405c62a10e8c376e8aeb98d5b67a02e647ea630e
Author: Zijun Hu <quic_zijuhu@xxxxxxxxxxx>
Date:   Sun Jan 5 16:34:02 2025 +0800

    driver core: class: Fix wild pointer dereferences in API class_dev_iter_next()
    
    [ Upstream commit e128f82f7006991c99a58114f70ef61e937b1ac1 ]
    
    There are a potential wild pointer dereferences issue regarding APIs
    class_dev_iter_(init|next|exit)(), as explained by below typical usage:
    
    // All members of @iter are wild pointers.
    struct class_dev_iter iter;
    
    // class_dev_iter_init(@iter, @class, ...) checks parameter @class for
    // potential class_to_subsys() error, and it returns void type and does
    // not initialize its output parameter @iter, so caller can not detect
    // the error and continues to invoke class_dev_iter_next(@iter) even if
    // @iter still contains wild pointers.
    class_dev_iter_init(&iter, ...);
    
    // Dereference these wild pointers in @iter here once suffer the error.
    while (dev = class_dev_iter_next(&iter)) { ... };
    
    // Also dereference these wild pointers here.
    class_dev_iter_exit(&iter);
    
    Actually, all callers of these APIs have such usage pattern in kernel tree.
    Fix by:
    - Initialize output parameter @iter by memset() in class_dev_iter_init()
      and give callers prompt by pr_crit() for the error.
    - Check if @iter is valid in class_dev_iter_next().
    
    Fixes: 7b884b7f24b4 ("driver core: class.c: convert to only use class_to_subsys")
    Reviewed-by: Jonathan Cameron <Jonathan.Cameron@xxxxxxxxxx>
    Signed-off-by: Zijun Hu <quic_zijuhu@xxxxxxxxxxx>
    Link: https://lore.kernel.org/r/20250105-class_fix-v6-1-3a2f1768d4d4@xxxxxxxxxxx
    Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/base/class.c b/drivers/base/class.c
index 582b5a02a5c41..d57f277978dc9 100644
--- a/drivers/base/class.c
+++ b/drivers/base/class.c
@@ -323,8 +323,12 @@ void class_dev_iter_init(struct class_dev_iter *iter, const struct class *class,
 	struct subsys_private *sp = class_to_subsys(class);
 	struct klist_node *start_knode = NULL;
 
-	if (!sp)
+	memset(iter, 0, sizeof(*iter));
+	if (!sp) {
+		pr_crit("%s: class %p was not registered yet\n",
+			__func__, class);
 		return;
+	}
 
 	if (start)
 		start_knode = &start->p->knode_class;
@@ -351,6 +355,9 @@ struct device *class_dev_iter_next(struct class_dev_iter *iter)
 	struct klist_node *knode;
 	struct device *dev;
 
+	if (!iter->sp)
+		return NULL;
+
 	while (1) {
 		knode = klist_next(&iter->ki);
 		if (!knode)




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux