Skip to content

Commit ebf5f96

Browse files
committed
tty: n_gsm: Modify gsmtty driver register method when config requester
jira VULN-676 cve-pre CVE-2023-6546 commit-author Zhenguo Zhao <Zhenguo.Zhao1@unisoc.com> commit 5b87686 As requester,because n_gsm has no uevent report for application,the application can't know dlci connect or disconnect. The application will control every dlcl dev by uevent,when application receive gsmtty0 dev remove uevent,it will close mux function,and change to normal mode. Example: Before modify: gsmld receive DLC0 DISC,no event report to application gsmld receive DLC1 SABM,no event report to application gsmld receive DLC1 DISC,no event report to application After modify: Receive DLC0 DISC,report "/devices/virtual/tty/gsmtty0" remove uevent Receive DLC1 SABM,report "/devices/virtual/tty/gsmtty1" add uevent Receive DLC1 DISC,report "/devices/virtual/tty/gsmtty1" remove uevent Signed-off-by: Zhenguo Zhao <Zhenguo.Zhao1@unisoc.com> Link: https://lore.kernel.org/r/1629461872-26965-7-git-send-email-zhenguo6858@gmail.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> (cherry picked from commit 5b87686) Signed-off-by: David Gomez <dgomez@ciq.com>
1 parent ac90cb3 commit ebf5f96

File tree

1 file changed

+19
-11
lines changed

1 file changed

+19
-11
lines changed

drivers/tty/n_gsm.c

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1429,6 +1429,8 @@ static void gsm_dlci_close(struct gsm_dlci *dlci)
14291429
kfifo_reset(&dlci->fifo);
14301430
} else
14311431
dlci->gsm->dead = true;
1432+
/* Unregister gsmtty driver,report gsmtty dev remove uevent for user */
1433+
tty_unregister_device(gsm_tty_driver, dlci->addr);
14321434
wake_up(&dlci->gsm->event);
14331435
/* A DLCI 0 close is a MUX termination so we need to kick that
14341436
back to userspace somehow */
@@ -1450,6 +1452,8 @@ static void gsm_dlci_open(struct gsm_dlci *dlci)
14501452
dlci->state = DLCI_OPEN;
14511453
if (debug & 8)
14521454
pr_debug("DLCI %d goes open.\n", dlci->addr);
1455+
/* Register gsmtty driver,report gsmtty dev add uevent for user */
1456+
tty_register_device(gsm_tty_driver, dlci->addr, NULL);
14531457
wake_up(&dlci->gsm->event);
14541458
}
14551459

@@ -2384,17 +2388,19 @@ static int gsmld_attach_gsm(struct tty_struct *tty, struct gsm_mux *gsm)
23842388
else {
23852389
/* Don't register device 0 - this is the control channel and not
23862390
a usable tty interface */
2387-
base = mux_num_to_base(gsm); /* Base for this MUX */
2388-
for (i = 1; i < NUM_DLCI; i++) {
2389-
struct device *dev;
2391+
if (gsm->initiator) {
2392+
base = mux_num_to_base(gsm); /* Base for this MUX */
2393+
for (i = 1; i < NUM_DLCI; i++) {
2394+
struct device *dev;
23902395

2391-
dev = tty_register_device(gsm_tty_driver,
2396+
dev = tty_register_device(gsm_tty_driver,
23922397
base + i, NULL);
2393-
if (IS_ERR(dev)) {
2394-
for (i--; i >= 1; i--)
2395-
tty_unregister_device(gsm_tty_driver,
2396-
base + i);
2397-
return PTR_ERR(dev);
2398+
if (IS_ERR(dev)) {
2399+
for (i--; i >= 1; i--)
2400+
tty_unregister_device(gsm_tty_driver,
2401+
base + i);
2402+
return PTR_ERR(dev);
2403+
}
23982404
}
23992405
}
24002406
}
@@ -2416,8 +2422,10 @@ static void gsmld_detach_gsm(struct tty_struct *tty, struct gsm_mux *gsm)
24162422
int i;
24172423

24182424
WARN_ON(tty != gsm->tty);
2419-
for (i = 1; i < NUM_DLCI; i++)
2420-
tty_unregister_device(gsm_tty_driver, base + i);
2425+
if (gsm->initiator) {
2426+
for (i = 1; i < NUM_DLCI; i++)
2427+
tty_unregister_device(gsm_tty_driver, base + i);
2428+
}
24212429
gsm_cleanup_mux(gsm);
24222430
tty_kref_put(gsm->tty);
24232431
gsm->tty = NULL;

0 commit comments

Comments
 (0)