linux/drivers/accessibility/speakup
Gaosheng Cui 2da67bff29 tty: fix possible null-ptr-defer in spk_ttyio_release
commit 5abbeebd82 upstream.

Run the following tests on the qemu platform:

syzkaller:~# modprobe speakup_audptr
 input: Speakup as /devices/virtual/input/input4
 initialized device: /dev/synth, node (MAJOR 10, MINOR 125)
 speakup 3.1.6: initialized
 synth name on entry is: (null)
 synth probe

spk_ttyio_initialise_ldisc failed because tty_kopen_exclusive returned
failed (errno -16), then remove the module, we will get a null-ptr-defer
problem, as follow:

syzkaller:~# modprobe -r speakup_audptr
 releasing synth audptr
 BUG: kernel NULL pointer dereference, address: 0000000000000080
 #PF: supervisor write access in kernel mode
 #PF: error_code(0x0002) - not-present page
 PGD 0 P4D 0
 Oops: 0002 [#1] PREEMPT SMP PTI
 CPU: 2 PID: 204 Comm: modprobe Not tainted 6.1.0-rc6-dirty #1
 RIP: 0010:mutex_lock+0x14/0x30
 Call Trace:
 <TASK>
  spk_ttyio_release+0x19/0x70 [speakup]
  synth_release.part.6+0xac/0xc0 [speakup]
  synth_remove+0x56/0x60 [speakup]
  __x64_sys_delete_module+0x156/0x250
  ? fpregs_assert_state_consistent+0x1d/0x50
  do_syscall_64+0x37/0x90
  entry_SYSCALL_64_after_hwframe+0x63/0xcd
 </TASK>
 Modules linked in: speakup_audptr(-) speakup
 Dumping ftrace buffer:

in_synth->dev was not initialized during modprobe, so we add check
for in_synth->dev to fix this bug.

Fixes: 4f2a81f3a8 ("speakup: Reference synth from tty and tty from synth")
Cc: stable <stable@kernel.org>
Signed-off-by: Gaosheng Cui <cuigaosheng1@huawei.com>
Link: https://lore.kernel.org/r/20221202060633.217364-1-cuigaosheng1@huawei.com
Reviewed-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2023-01-24 07:22:46 +01:00
..
buffers.c
DefaultKeyAssignments
devsynth.c
fakekey.c
i18n.c speakup: use C99 syntax for array initializers 2021-07-21 13:45:53 +02:00
i18n.h speakup: Separate out translations for bright colors names 2021-06-15 17:07:46 +02:00
Kconfig speakup: only build serialio when ISA is enabled 2020-08-18 13:15:34 +02:00
keyhelp.c
kobjects.c
main.c speakup: fix a segfault caused by switching consoles 2022-11-26 09:24:44 +01:00
Makefile speakup: only build serialio when ISA is enabled 2020-08-18 13:15:34 +02:00
selection.c speakup: Fix clearing selection in safe context 2020-11-09 18:14:20 +01:00
serialio.c speakup: add the missing synth parameter to all io functions 2021-01-27 13:12:04 +01:00
serialio.h
speakup_acnt.h
speakup_acntpc.c speakup: add the missing synth parameter to all io functions 2021-01-27 13:12:04 +01:00
speakup_acntsa.c
speakup_apollo.c speakup: add the missing synth parameter to all io functions 2021-01-27 13:12:04 +01:00
speakup_audptr.c speakup: add the missing synth parameter to all io functions 2021-01-27 13:12:04 +01:00
speakup_bns.c
speakup_decext.c speakup: add the missing synth parameter to all io functions 2021-01-27 13:12:04 +01:00
speakup_decpc.c speakup: add the missing synth parameter to all io functions 2021-01-27 13:12:04 +01:00
speakup_dectlk.c speakup-dectlk: Restore pitch setting 2022-02-16 12:56:37 +01:00
speakup_dtlk.c speakup: add the missing synth parameter to all io functions 2021-01-27 13:12:04 +01:00
speakup_dtlk.h
speakup_dummy.c speakup_dummy: log about characters received by the dummy driver 2020-11-09 18:15:32 +01:00
speakup_keypc.c speakup: add the missing synth parameter to all io functions 2021-01-27 13:12:04 +01:00
speakup_ltlk.c speakup: add the missing synth parameter to all io functions 2021-01-27 13:12:04 +01:00
speakup_soft.c speakup: replace sprintf() by scnprintf() 2021-07-21 13:46:03 +02:00
speakup_spkout.c speakup: add the missing synth parameter to all io functions 2021-01-27 13:12:04 +01:00
speakup_txprt.c
speakup.h speakup: Fix clearing selection in safe context 2020-11-09 18:14:20 +01:00
speakupmap.h
speakupmap.map
spk_priv_keyinfo.h
spk_priv.h speakup: add the missing synth parameter to all io functions 2021-01-27 13:12:04 +01:00
spk_ttyio.c tty: fix possible null-ptr-defer in spk_ttyio_release 2023-01-24 07:22:46 +01:00
spk_types.h speakup: Make dectlk flush timeout configurable 2021-02-04 17:05:48 +01:00
synth.c speakup: Make dectlk flush timeout configurable 2021-02-04 17:05:48 +01:00
thread.c
TODO
varhandlers.c speakup: Make dectlk flush timeout configurable 2021-02-04 17:05:48 +01:00