Commit 7ee00fdb authored by Jiri Slaby's avatar Jiri Slaby Committed by Greg Kroah-Hartman
Browse files

TTY: vt, fix paste_selection ldisc handling



There used to be a single tty_ldisc_ref_wait. But then, when a
big-tty-mutex (BTM) was introduced, it has to be tty_ldisc_ref +
tty_unlock + tty_ldisc_ref_wait + tty_lock. Later, BTM was removed
from that path and tty_ldisc_ref + tty_ldisc_ref_wait remained there.
But it makes no sense now. So leave there only tty_ldisc_ref_wait.

And when we have a reference to an ldisc, actually use it in the loop.
Otherwise it may be racy.

Signed-off-by: default avatarJiri Slaby <jslaby@suse.cz>
Acked-by: default avatarAlan Cox <alan@linux.intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent fa2ecfc5
Loading
Loading
Loading
Loading
+2 −7
Original line number Diff line number Diff line
@@ -341,14 +341,10 @@ int paste_selection(struct tty_struct *tty)
	struct  tty_ldisc *ld;
	DECLARE_WAITQUEUE(wait, current);


	console_lock();
	poke_blanked_console();
	console_unlock();

	/* FIXME: wtf is this supposed to achieve ? */
	ld = tty_ldisc_ref(tty);
	if (!ld)
	ld = tty_ldisc_ref_wait(tty);

	/* FIXME: this is completely unsafe */
@@ -361,8 +357,7 @@ int paste_selection(struct tty_struct *tty)
		}
		count = sel_buffer_lth - pasted;
		count = min(count, tty->receive_room);
		tty->ldisc->ops->receive_buf(tty, sel_buffer + pasted,
								NULL, count);
		ld->ops->receive_buf(tty, sel_buffer + pasted, NULL, count);
		pasted += count;
	}
	remove_wait_queue(&vc->paste_wait, &wait);