• Daniel Starke's avatar
    Revert "tty: n_gsm: fix UAF in gsm_cleanup_mux" · 29346e21
    Daniel Starke authored
    This reverts commit 9b9c8195.
    
    The commit above is reverted as it did not solve the original issue.
    
    gsm_cleanup_mux() tries to free up the virtual ttys by calling
    gsm_dlci_release() for each available DLCI. There, dlci_put() is called to
    decrease the reference counter for the DLCI via tty_port_put() which
    finally calls gsm_dlci_free(). This already clears the pointer which is
    being checked in gsm_cleanup_mux() before calling gsm_dlci_release().
    Therefore, it is not necessary to clear this pointer in gsm_cleanup_mux()
    as done in the reverted commit. The commit introduces a null pointer
    dereference:
     <TASK>
     ? __die+0x1f/0x70
     ? page_fault_oops+0x156/0x420
     ? search_exception_tables+0x37/0x50
     ? fixup_exception+0x21/0x310
     ? exc_page_fault+0x69/0x150
     ? asm_exc_page_fault+0x26/0x30
     ? tty_port_put+0x19/0xa0
     gsmtty_cleanup+0x29/0x80 [n_gsm]
     release_one_tty+0x37/0xe0
     process_one_work+0x1e6/0x3e0
     worker_thread+0x4c/0x3d0
     ? __pfx_worker_thread+0x10/0x10
     kthread+0xe1/0x110
     ? __pfx_kthread+0x10/0x10
     ret_from_fork+0x2f/0x50
     ? __pfx_kthread+0x10/0x10
     ret_from_fork_asm+0x1b/0x30
     </TASK>
    
    The actual issue is that nothing guards dlci_put() from being called
    multiple times while the tty driver was triggered but did not yet finished
    calling gsm_dlci_free().
    
    Fixes: 9b9c8195 ("tty: n_gsm: fix UAF in gsm_cleanup_mux")
    Cc: stable <stable@kernel.org>
    Signed-off-by: default avatarDaniel Starke <daniel.starke@siemens.com>
    Link: https://lore.kernel.org/r/20230914051507.3240-1-daniel.starke@siemens.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    29346e21
n_gsm.c 112 KB