Patch "USB: gadget: Fix use-after-free during usb config switch" has been added to the 6.0-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

    USB: gadget: Fix use-after-free during usb config switch

to the 6.0-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:
     usb-gadget-fix-use-after-free-during-usb-config-swit.patch
and it can be found in the queue-6.0 subdirectory.

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



commit 8a22a0454c5da4f9012d25903e461605c36f7ad1
Author: Jiantao Zhang <water.zhangjiantao@xxxxxxxxxx>
Date:   Mon Nov 21 13:08:05 2022 +0000

    USB: gadget: Fix use-after-free during usb config switch
    
    [ Upstream commit afdc12887f2b2ecf20d065a7d81ad29824155083 ]
    
    In the process of switching USB config from rndis to other config,
    if the hardware does not support the ->pullup callback, or the
    hardware encounters a low probability fault, both of them may cause
    the ->pullup callback to fail, which will then cause a system panic
    (use after free).
    
    The gadget drivers sometimes need to be unloaded regardless of the
    hardware's behavior.
    
    Analysis as follows:
    =======================================================================
    (1) write /config/usb_gadget/g1/UDC "none"
    
    gether_disconnect+0x2c/0x1f8
    rndis_disable+0x4c/0x74
    composite_disconnect+0x74/0xb0
    configfs_composite_disconnect+0x60/0x7c
    usb_gadget_disconnect+0x70/0x124
    usb_gadget_unregister_driver+0xc8/0x1d8
    gadget_dev_desc_UDC_store+0xec/0x1e4
    
    (2) rm /config/usb_gadget/g1/configs/b.1/f1
    
    rndis_deregister+0x28/0x54
    rndis_free+0x44/0x7c
    usb_put_function+0x14/0x1c
    config_usb_cfg_unlink+0xc4/0xe0
    configfs_unlink+0x124/0x1c8
    vfs_unlink+0x114/0x1dc
    
    (3) rmdir /config/usb_gadget/g1/functions/rndis.gs4
    
    panic+0x1fc/0x3d0
    do_page_fault+0xa8/0x46c
    do_mem_abort+0x3c/0xac
    el1_sync_handler+0x40/0x78
    0xffffff801138f880
    rndis_close+0x28/0x34
    eth_stop+0x74/0x110
    dev_close_many+0x48/0x194
    rollback_registered_many+0x118/0x814
    unregister_netdev+0x20/0x30
    gether_cleanup+0x1c/0x38
    rndis_attr_release+0xc/0x14
    kref_put+0x74/0xb8
    configfs_rmdir+0x314/0x374
    
    If gadget->ops->pullup() return an error, function rndis_close() will be
    called, then it will causes a use-after-free problem.
    =======================================================================
    
    Fixes: 0a55187a1ec8 ("USB: gadget core: Issue ->disconnect() callback from usb_gadget_disconnect()")
    Signed-off-by: Jiantao Zhang <water.zhangjiantao@xxxxxxxxxx>
    Signed-off-by: TaoXue <xuetao09@xxxxxxxxxx>
    Link: https://lore.kernel.org/r/20221121130805.10735-1-water.zhangjiantao@xxxxxxxxxx
    Signed-off-by: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/usb/gadget/udc/core.c b/drivers/usb/gadget/udc/core.c
index c63c0c2cf649..bf9878e1a72a 100644
--- a/drivers/usb/gadget/udc/core.c
+++ b/drivers/usb/gadget/udc/core.c
@@ -734,13 +734,13 @@ int usb_gadget_disconnect(struct usb_gadget *gadget)
 	}
 
 	ret = gadget->ops->pullup(gadget, 0);
-	if (!ret) {
+	if (!ret)
 		gadget->connected = 0;
-		mutex_lock(&udc_lock);
-		if (gadget->udc->driver)
-			gadget->udc->driver->disconnect(gadget);
-		mutex_unlock(&udc_lock);
-	}
+
+	mutex_lock(&udc_lock);
+	if (gadget->udc->driver)
+		gadget->udc->driver->disconnect(gadget);
+	mutex_unlock(&udc_lock);
 
 out:
 	trace_usb_gadget_disconnect(gadget, ret);



[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