Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2cb5998b authored by Alan Cox's avatar Alan Cox Committed by Linus Torvalds
Browse files

tty: the vhangup syscall is racy



We now have the infrastructure to sort this out but rather than teaching
the syscall tty lock rules we move the hard work into a tty helper

Signed-off-by: default avatarAlan Cox <alan@redhat.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 216ba023
Loading
Loading
Loading
Loading
+19 −0
Original line number Original line Diff line number Diff line
@@ -729,6 +729,25 @@ void tty_vhangup(struct tty_struct *tty)


EXPORT_SYMBOL(tty_vhangup);
EXPORT_SYMBOL(tty_vhangup);


/**
 *	tty_vhangup_self	-	process vhangup for own ctty
 *
 *	Perform a vhangup on the current controlling tty
 */

void tty_vhangup_self(void)
{
	struct tty_struct *tty;

	mutex_lock(&tty_mutex);
	tty = get_current_tty();
	if (tty) {
		tty_vhangup(tty);
		tty_kref_put(tty);
	}
	mutex_unlock(&tty_mutex);
}

/**
/**
 *	tty_hung_up_p		-	was tty hung up
 *	tty_hung_up_p		-	was tty hung up
 *	@filp: file pointer of tty
 *	@filp: file pointer of tty
+1 −2
Original line number Original line Diff line number Diff line
@@ -1141,8 +1141,7 @@ EXPORT_SYMBOL(sys_close);
asmlinkage long sys_vhangup(void)
asmlinkage long sys_vhangup(void)
{
{
	if (capable(CAP_SYS_TTY_CONFIG)) {
	if (capable(CAP_SYS_TTY_CONFIG)) {
		/* XXX: this needs locking */
		tty_vhangup_self();
		tty_vhangup(current->signal->tty);
		return 0;
		return 0;
	}
	}
	return -EPERM;
	return -EPERM;
+1 −0
Original line number Original line Diff line number Diff line
@@ -361,6 +361,7 @@ extern int is_ignored(int sig);
extern int tty_signal(int sig, struct tty_struct *tty);
extern int tty_signal(int sig, struct tty_struct *tty);
extern void tty_hangup(struct tty_struct *tty);
extern void tty_hangup(struct tty_struct *tty);
extern void tty_vhangup(struct tty_struct *tty);
extern void tty_vhangup(struct tty_struct *tty);
extern void tty_vhangup_self(void);
extern void tty_unhangup(struct file *filp);
extern void tty_unhangup(struct file *filp);
extern int tty_hung_up_p(struct file *filp);
extern int tty_hung_up_p(struct file *filp);
extern void do_SAK(struct tty_struct *tty);
extern void do_SAK(struct tty_struct *tty);