tty: n_gsm: fix the UAF caused by race condition in gsm_cleanup_mux

In commit 9b9c8195f3f0 ("tty: n_gsm: fix UAF in gsm_cleanup_mux"), the UAF
problem is not completely fixed. There is a race condition in
gsm_cleanup_mux(), which caused this UAF.

The UAF problem is triggered by the following race:
task[5046] task[5054]
----------------------- -----------------------
gsm_cleanup_mux();
dlci = gsm->dlci[0];
mutex_lock(&gsm->mutex);
gsm_cleanup_mux();
dlci = gsm->dlci[0]; //Didn't take the lock
gsm_dlci_release(gsm->dlci[i]);
gsm->dlci[i] = NULL;
mutex_unlock(&gsm->mutex);
mutex_lock(&gsm->mutex);
dlci->dead = true; //UAF

Fix it by assigning values after mutex_lock().

Link: https://syzkaller.appspot.com/text?tag=CrashReport&x=176188b5a80000
Cc: stable <stable@kernel.org>
Fixes: 9b9c8195f3f0 ("tty: n_gsm: fix UAF in gsm_cleanup_mux")
Fixes: aa371e96f05d ("tty: n_gsm: fix restart handling via CLD command")
Signed-off-by: Yi Yang <yiyang13@huawei.com>
Co-developed-by: Qiumiao Zhang <zhangqiumiao1@huawei.com>
Signed-off-by: Qiumiao Zhang <zhangqiumiao1@huawei.com>
Link: https://lore.kernel.org/r/20230811031121.153237-1-yiyang13@huawei.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by Yi Yang and committed by Greg Kroah-Hartman 3c4f8333 a4a79e03

Changed files
+2 -1
drivers
tty
+2 -1
drivers/tty/n_gsm.c
··· 3042 3042 static void gsm_cleanup_mux(struct gsm_mux *gsm, bool disc) 3043 3043 { 3044 3044 int i; 3045 - struct gsm_dlci *dlci = gsm->dlci[0]; 3045 + struct gsm_dlci *dlci; 3046 3046 struct gsm_msg *txq, *ntxq; 3047 3047 3048 3048 gsm->dead = true; 3049 3049 mutex_lock(&gsm->mutex); 3050 3050 3051 + dlci = gsm->dlci[0]; 3051 3052 if (dlci) { 3052 3053 if (disc && dlci->state != DLCI_CLOSED) { 3053 3054 gsm_dlci_begin_close(dlci);