• Gaosheng Cui's avatar
    tty: fix possible null-ptr-defer in spk_ttyio_release · 5abbeebd
    Gaosheng Cui authored
    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: 4f2a81f3 ("speakup: Reference synth from tty and tty from synth")
    Cc: stable <stable@kernel.org>
    Signed-off-by: default avatarGaosheng Cui <cuigaosheng1@huawei.com>
    Link: https://lore.kernel.org/r/20221202060633.217364-1-cuigaosheng1@huawei.comReviewed-by: default avatarSamuel Thibault <samuel.thibault@ens-lyon.org>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    5abbeebd
spk_ttyio.c 8.78 KB