Skip to content

Commit 96b169f

Browse files
dstarke-siemensgregkh
authored andcommitted
tty: n_gsm: fix NULL pointer access due to DLCI release
The here fixed commit made the tty hangup asynchronous to avoid a circular locking warning. I could not reproduce this warning. Furthermore, due to the asynchronous hangup the function call now gets queued up while the underlying tty is being freed. Depending on the timing this results in a NULL pointer access in the global work queue scheduler. To be precise in process_one_work(). Therefore, the previous commit made the issue worse which it tried to fix. This patch fixes this by falling back to the old behavior which uses a blocking tty hangup call before freeing up the associated tty. Fixes: 7030082 ("tty: n_gsm: avoid recursive locking with async port hangup") Cc: stable@vger.kernel.org Signed-off-by: Daniel Starke <daniel.starke@siemens.com> Link: https://lore.kernel.org/r/20220218073123.2121-4-daniel.starke@siemens.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent e3b7468 commit 96b169f

1 file changed

Lines changed: 6 additions & 1 deletion

File tree

drivers/tty/n_gsm.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1752,7 +1752,12 @@ static void gsm_dlci_release(struct gsm_dlci *dlci)
17521752
gsm_destroy_network(dlci);
17531753
mutex_unlock(&dlci->mutex);
17541754

1755-
tty_hangup(tty);
1755+
/* We cannot use tty_hangup() because in tty_kref_put() the tty
1756+
* driver assumes that the hangup queue is free and reuses it to
1757+
* queue release_one_tty() -> NULL pointer panic in
1758+
* process_one_work().
1759+
*/
1760+
tty_vhangup(tty);
17561761

17571762
tty_port_tty_set(&dlci->port, NULL);
17581763
tty_kref_put(tty);

0 commit comments

Comments
 (0)