android_kernel_samsung_sm8650/drivers/accessibility/speakup
Gaosheng Cui 64152e05a4 tty: fix possible null-ptr-defer in spk_ttyio_release
commit 5abbeebd8296c2301023b8dc4b5a6c0d5229b4f5 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:24:37 +01:00
..
.gitignore speakup: Generate speakupmap.h automatically 2022-06-27 15:15:55 +02:00
buffers.c staging/speakup: Move out of staging 2020-07-29 14:02:41 +02:00
DefaultKeyAssignments staging/speakup: Move out of staging 2020-07-29 14:02:41 +02:00
devsynth.c staging/speakup: Move out of staging 2020-07-29 14:02:41 +02:00
fakekey.c accessiblity: speakup: cleanup comments 2022-04-20 19:24:00 +02:00
genmap.c speakup: Generate speakupmap.h automatically 2022-06-27 15:15:55 +02:00
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 staging/speakup: Move out of staging 2020-07-29 14:02:41 +02:00
kobjects.c staging/speakup: Move out of staging 2020-07-29 14:02:41 +02:00
main.c speakup: fix a segfault caused by switching consoles 2022-11-09 15:21:55 +01:00
Makefile speakup: Generate speakupmap.h automatically 2022-06-27 15:15:55 +02:00
makemapdata.c speakup: Generate speakupmap.h automatically 2022-06-27 15:15:55 +02:00
selection.c speakup: Fix clearing selection in safe context 2020-11-09 18:14:20 +01:00
serialio.c accessiblity: speakup: cleanup comments 2022-04-20 19:24:00 +02:00
serialio.h serial: Consolidate BOTH_EMPTY use 2022-06-27 14:41:31 +02:00
speakup_acnt.h staging/speakup: Move out of staging 2020-07-29 14:02:41 +02:00
speakup_acntpc.c accessiblity: speakup: cleanup comments 2022-04-20 19:24:00 +02:00
speakup_acntsa.c accessiblity: speakup: cleanup comments 2022-04-20 19:24:00 +02:00
speakup_apollo.c accessiblity: speakup: cleanup comments 2022-04-20 19:24:00 +02:00
speakup_audptr.c accessiblity: speakup: cleanup comments 2022-04-20 19:24:00 +02:00
speakup_bns.c accessiblity: speakup: cleanup comments 2022-04-20 19:24:00 +02:00
speakup_decext.c accessiblity: speakup: cleanup comments 2022-04-20 19:24:00 +02: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 accessiblity: speakup: cleanup comments 2022-04-20 19:24:00 +02:00
speakup_dtlk.c accessiblity: speakup: cleanup comments 2022-04-20 19:24:00 +02:00
speakup_dtlk.h staging/speakup: Move out of staging 2020-07-29 14:02:41 +02:00
speakup_dummy.c speakup-dummy: Add support for PUNCT variable 2022-09-01 16:59:43 +02:00
speakup_keypc.c accessiblity: speakup: cleanup comments 2022-04-20 19:24:00 +02:00
speakup_ltlk.c accessiblity: speakup: cleanup comments 2022-04-20 19:24:00 +02:00
speakup_soft.c speakup_soft: Add direct module parameter 2022-09-01 16:59:59 +02:00
speakup_spkout.c accessiblity: speakup: cleanup comments 2022-04-20 19:24:00 +02:00
speakup_txprt.c accessiblity: speakup: cleanup comments 2022-04-20 19:24:00 +02:00
speakup.h speakup: Fix clearing selection in safe context 2020-11-09 18:14:20 +01:00
speakupmap.map staging/speakup: Move out of staging 2020-07-29 14:02:41 +02:00
spk_priv_keyinfo.h staging/speakup: Move out of staging 2020-07-29 14:02:41 +02:00
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:24:37 +01:00
spk_types.h speakup: Notify synthesizers of the punctuation level change 2022-09-01 16:59:44 +02:00
synth.c speakup: Allow lower values for the flush parameter 2022-02-08 12:12:27 +01:00
thread.c staging/speakup: Move out of staging 2020-07-29 14:02:41 +02:00
TODO staging/speakup: Move out of staging 2020-07-29 14:02:41 +02:00
utils.h speakup: replace utils' u_char with unsigned char 2022-11-09 15:25:24 +01:00
varhandlers.c speakup: Notify synthesizers of the punctuation level change 2022-09-01 16:59:44 +02:00