Blob Blame History Raw

Based on upstream patch:

	From 8998ad001fdb58ceba4147f8aa4c72203117db25 Mon Sep 17 00:00:00 2001
	From: Karel Zak <kzak@redhat.com>
	Date: Wed, 5 Jun 2013 14:31:00 +0200
	Subject: [PATCH] login: use TCSANOW to remove HUPCL

	login(1) code:

		ttt.c_cflag &= ~HUPCL;
		tcsetattr(0, TCSAFLUSH, &ttt);

		close(STDIN_FILENO);
		close(STDOUT_FILENO);
		close(STDERR_FILENO);

		signal(SIGHUP, SIG_IGN);        /* so vhangup() wont kill us */
		vhangup();
		signal(SIGHUP, SIG_DFL);

	strace :

		ioctl(0, SNDCTL_TMR_CONTINUE or SNDRV_TIMER_IOCTL_GPARAMS or TCSETSF, {B9600 opost isig icanon echo ...}) = 0
		close(0)                                = 0
		close(1)                                = 0
		close(2)                                = 0
		--- SIGHUP {si_signo=SIGHUP, si_code=SI_KERNEL} ---
		--- SIGTERM {si_signo=SIGTERM, si_code=SI_USER, si_pid=1, si_uid=0} ---
		+++ killed by SIGTERM +++

	It seems we get SIGHUP (and SIGTERM from systemd) before vhangup().
	The problem occur sometimes.

	I guess it's because TCSAFLUSH is not applied immediately, so it would
	be probably better to use TCSANOW to make the code more robust.

	References: https://bugzilla.redhat.com/show_bug.cgi?id=962145
	Signed-off-by: Karel Zak <kzak@redhat.com>

diff -up util-linux-2.22.2/login-utils/login.c.kzak util-linux-2.22.2/login-utils/login.c
--- util-linux-2.22.2/login-utils/login.c.kzak	2013-08-01 14:03:39.189156123 +0200
+++ util-linux-2.22.2/login-utils/login.c	2013-08-01 14:06:16.942580758 +0200
@@ -407,7 +407,7 @@ static void init_tty(struct login_contex
 	}
 
 	/* Kill processes left on this tty */
-	tcsetattr(0, TCSAFLUSH, &ttt);
+	tcsetattr(0, TCSANOW, &ttt);
 
 	/*
 	 * Let's close file decriptors before vhangup
@@ -1323,10 +1323,10 @@ int main(int argc, char **argv)
 		close(cnt);
 
 	setpgrp();	 /* set pgid to pid this means that setsid() will fail */
+	init_tty(&cxt);
 
 	openlog("login", LOG_ODELAY, LOG_AUTHPRIV);
 
-	init_tty(&cxt);
 	init_loginpam(&cxt);
 
 	/* login -f, then the user has already been authenticated */