Patch "drm/bridge: megachips: Fix error handling in i2c_register_driver()" has been added to the 6.1-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

    drm/bridge: megachips: Fix error handling in i2c_register_driver()

to the 6.1-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:
     drm-bridge-megachips-fix-error-handling-in-i2c_regis.patch
and it can be found in the queue-6.1 subdirectory.

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



commit 1c4a5c5ce62fc4479fae47e99bde5ee7d0c4c877
Author: Yuan Can <yuancan@xxxxxxxxxx>
Date:   Tue Nov 8 09:12:26 2022 +0000

    drm/bridge: megachips: Fix error handling in i2c_register_driver()
    
    [ Upstream commit 4ecff954c370b82bce45bdca2846c5c5563e8a8a ]
    
    A problem about insmod megachips-stdpxxxx-ge-b850v3-fw.ko failed is
    triggered with the following log given:
    
    [ 4497.981497] Error: Driver 'stdp4028-ge-b850v3-fw' is already registered, aborting...
    insmod: ERROR: could not insert module megachips-stdpxxxx-ge-b850v3-fw.ko: Device or resource busy
    
    The reason is that stdpxxxx_ge_b850v3_init() returns i2c_add_driver()
    directly without checking its return value, if i2c_add_driver() failed,
    it returns without calling i2c_del_driver() on the previous i2c driver,
    resulting the megachips-stdpxxxx-ge-b850v3-fw can never be installed
    later.
    A simple call graph is shown as below:
    
     stdpxxxx_ge_b850v3_init()
       i2c_add_driver(&stdp4028_ge_b850v3_fw_driver)
       i2c_add_driver(&stdp2690_ge_b850v3_fw_driver)
         i2c_register_driver()
           driver_register()
             bus_add_driver()
               priv = kzalloc(...) # OOM happened
       # return without delete stdp4028_ge_b850v3_fw_driver
    
    Fix by calling i2c_del_driver() on stdp4028_ge_b850v3_fw_driver when
    i2c_add_driver() returns error.
    
    Fixes: fcfa0ddc18ed ("drm/bridge: Drivers for megachips-stdpxxxx-ge-b850v3-fw (LVDS-DP++)")
    Signed-off-by: Yuan Can <yuancan@xxxxxxxxxx>
    Reviewed-by: Andrzej Hajda <andrzej.hajda@xxxxxxxxx>
    Tested-by: Ian Ray <ian.ray@xxxxxx>
    Signed-off-by: Robert Foss <robert.foss@xxxxxxxxxx>
    Link: https://patchwork.freedesktop.org/patch/msgid/20221108091226.114524-1-yuancan@xxxxxxxxxx
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/gpu/drm/bridge/megachips-stdpxxxx-ge-b850v3-fw.c b/drivers/gpu/drm/bridge/megachips-stdpxxxx-ge-b850v3-fw.c
index 97359f807bfc3..cbfa05a6767b5 100644
--- a/drivers/gpu/drm/bridge/megachips-stdpxxxx-ge-b850v3-fw.c
+++ b/drivers/gpu/drm/bridge/megachips-stdpxxxx-ge-b850v3-fw.c
@@ -440,7 +440,11 @@ static int __init stdpxxxx_ge_b850v3_init(void)
 	if (ret)
 		return ret;
 
-	return i2c_add_driver(&stdp2690_ge_b850v3_fw_driver);
+	ret = i2c_add_driver(&stdp2690_ge_b850v3_fw_driver);
+	if (ret)
+		i2c_del_driver(&stdp4028_ge_b850v3_fw_driver);
+
+	return ret;
 }
 module_init(stdpxxxx_ge_b850v3_init);
 



[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