linux/drivers/tty
Hui Peng 39495ef5d6 vt: selection: Fix unsigned underflow and slab-out-of-bounds read in paste_selection()
In paste_selection(), the loop copies min_t(unsigned int,
vc_sel.buf_len - pasted,tty->receive_room) bytes per iteration into
tty_ldisc_receive_buf() and increments pasted += count.

Because the selection mutex (vc_sel.lock) is dropped inside the loop
Whenever the line discipline buffer fills up and paste_selection()
sleeps on tty->write_wait, a concurrent TIOCLINUX (TIOCL_SETSEL) ioctl
can replace vc_sel.buffer with a shorter selection and reduce
vc_sel.buf_len below pasted.

When paste_selection() resumes, vc_sel.buf_len - pasted underflows as an
unsigned integer to a large positive value, causing
tty_ldisc_receive_buf(ld, vc_sel.buffer + pasted, NULL, count) to read
up to 4094 bytes out-of-bounds past the newly allocated vc_sel.buffer.

Fix this by terminating the loop when pasted >= vc_sel.buf_len.

Kernel stack trace (Linux 7.3.0-rc3):
 ==================================================================
 BUG: KASAN: slab-out-of-bounds in n_tty_receive_buf_common+0xa01/0x1650
 Read of size 4094 at addr ffff888101c58010 by task kworker/u17:1/65
 Workqueue: events_unbound flush_to_ldisc
 Call Trace:
  <TASK>
  dump_stack_lvl+0x70/0xa0
  print_report+0x153/0x4c6
  kasan_report+0xf1/0x120
  kasan_check_range+0x11c/0x200
  __asan_memcpy+0x29/0x70
  n_tty_receive_buf_common+0xa01/0x1650
  tty_ldisc_receive_buf+0x66/0x110
  tty_port_default_receive_buf+0x6b/0xb0
  flush_to_ldisc+0x1b4/0x410
  process_one_work+0x6ff/0x1110
  worker_thread+0x4a8/0xb70
  kthread+0x307/0x3e0
  ret_from_fork+0x3ed/0x680
  </TASK>
 ==================================================================

Fixes: e8c75a30a2 ("vt: selection, push sel_lock up")
Cc: stable <stable@kernel.org>
Assisted-by: LLM
Signed-off-by: Hui Peng <benquike@gmail.com>
Link: https://patch.msgid.link/20260919110041.3763078-1-benquike@gmail.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2026-10-01 11:15:46 +02:00
..
hvc tty: hvc: restrict HVC_DCC to ARMv6+ and ARM64 2026-07-17 13:03:42 +02:00
serdev TTY / Serial driver updates for 7.3-rc1 2026-08-25 10:59:12 -07:00
serial serial: sc16is7xx: reduce TX refill rate with half-FIFO trigger 2026-10-01 11:07:24 +02:00
vt vt: selection: Fix unsigned underflow and slab-out-of-bounds read in paste_selection() 2026-10-01 11:15:46 +02:00
amiserial.c tty: amiserial: fix broken TIOCMIWAIT 2026-09-23 12:01:19 +02:00
ehv_bytechan.c Convert 'alloc_obj' family to use the new default GFP_KERNEL argument 2026-02-21 17:09:51 -08:00
goldfish.c Merge 7.2-rc3 into tty-next 2026-07-13 07:11:57 +02:00
Kconfig tty: remove the ipwireless driver 2026-08-03 14:43:22 +02:00
Makefile tty: remove the ipwireless driver 2026-08-03 14:43:22 +02:00
mips_ejtag_fdc.c treewide, timers: Rename from_timer() to timer_container_of() 2025-06-08 09:07:37 +02:00
moxa.c treewide: refresh kmalloc_obj() conversions 2026-09-04 21:37:00 -07:00
mxser.c mxser: use guard()s 2025-08-17 12:46:26 +02:00
n_gsm.c tty: n_gsm: fix missing modem controls after DLCI open in convergence layer type 2 2026-09-23 11:45:08 +02:00
n_hdlc.c tty: synclink_gt: remove broken driver 2026-05-11 16:55:56 +02:00
n_null.c
n_tty.c tty: n_tty: use guard()s 2025-11-21 18:30:40 +01:00
nozomi.c Convert 'alloc_obj' family to use the new default GFP_KERNEL argument 2026-02-21 17:09:51 -08:00
pty.c tty: tty_port: add workqueue to flip TTY buffer 2026-03-12 15:26:29 +01:00
rpmsg_tty.c Convert 'alloc_obj' family to use the new default GFP_KERNEL argument 2026-02-21 17:09:51 -08:00
sysrq.c Convert 'alloc_obj' family to use the new default GFP_KERNEL argument 2026-02-21 17:09:51 -08:00
tty_audit.c Convert 'alloc_obj' family to use the new default GFP_KERNEL argument 2026-02-21 17:09:51 -08:00
tty_baudrate.c
tty_buffer.c tty: tty_port: add workqueue to flip TTY buffer 2026-03-12 15:26:29 +01:00
tty_io.c tty: fix saved termios reset race 2026-10-01 11:05:17 +02:00
tty_ioctl.c tty: simplify throttling using guard()s 2025-04-25 13:46:30 +02:00
tty_jobctrl.c tty: tty_jobctrl: use guard() in tiocgsid() 2026-07-07 17:22:45 +02:00
tty_ldisc.c tty: constify tty_ldisc_ops 2026-03-12 15:05:34 +01:00
tty_ldsem.c tty/ldsem: Remove unused ldsem_down_write_trylock 2025-02-04 14:38:42 +01:00
tty_mutex.c
tty_port.c tty: port: fix tty_port_tty_vhangup() race 2026-09-23 11:59:31 +02:00
tty.h tty: convert THROTTLE constants into enum 2023-10-03 14:31:16 +02:00
ttynull.c tty: add missing MODULE_DESCRIPTION() macros 2024-06-24 16:10:11 +02:00
vcc.c tty: vcc: hold port lock when clearing tty pointer in vcc_cleanup 2026-09-23 12:20:27 +02:00