* libmisc/utmp.c: Do not trust the current utmp entry's ut_line.

Always set ut_line based on ttyname(0).
This commit is contained in:
nekral-guest 2009-04-17 21:25:30 +00:00
parent 5298ac3dd9
commit d2a822fe39
2 changed files with 17 additions and 11 deletions

View File

@ -2,6 +2,8 @@
* NEWS, src/login.c: Do not trust the current utmp entry's ut_line * NEWS, src/login.c: Do not trust the current utmp entry's ut_line
to set PAM_TTY. to set PAM_TTY.
* libmisc/utmp.c: Do not trust the current utmp entry's ut_line.
Always set ut_line based on ttyname(0).
2009-04-15 Nicolas François <nicolas.francois@centraliens.net> 2009-04-15 Nicolas François <nicolas.francois@centraliens.net>

View File

@ -113,12 +113,22 @@ void checkutmp (bool picky)
&& ( (LOGIN_PROCESS == ut->ut_type) && ( (LOGIN_PROCESS == ut->ut_type)
|| (USER_PROCESS == ut->ut_type)) || (USER_PROCESS == ut->ut_type))
/* A process may have failed to close an entry /* A process may have failed to close an entry
* Check if this entry refers to this tty */ * Check if this entry refers to the current tty */
&& is_my_tty (ut->ut_line)) { && is_my_tty (ut->ut_line)) {
break; break;
} }
} }
/* We cannot trust the ut_line field. Prepare the new value. */
line = ttyname (0);
if (NULL == line) {
(void) puts (NO_TTY);
exit (EXIT_FAILURE);
}
if (strncmp (line, "/dev/", 5) == 0) {
line += 5;
}
/* If there is one, just use it, otherwise create a new one. */ /* If there is one, just use it, otherwise create a new one. */
if (NULL != ut) { if (NULL != ut) {
utent = *ut; utent = *ut;
@ -127,23 +137,17 @@ void checkutmp (bool picky)
(void) puts (NO_UTENT); (void) puts (NO_UTENT);
exit (EXIT_FAILURE); exit (EXIT_FAILURE);
} }
line = ttyname (0);
if (NULL == line) {
(void) puts (NO_TTY);
exit (EXIT_FAILURE);
}
if (strncmp (line, "/dev/", 5) == 0) {
line += 5;
}
memset ((void *) &utent, 0, sizeof utent); memset ((void *) &utent, 0, sizeof utent);
utent.ut_type = LOGIN_PROCESS; utent.ut_type = LOGIN_PROCESS;
utent.ut_pid = pid; utent.ut_pid = pid;
strncpy (utent.ut_line, line, sizeof utent.ut_line);
/* XXX - assumes /dev/tty?? or /dev/pts/?? */ /* XXX - assumes /dev/tty?? or /dev/pts/?? */
strncpy (utent.ut_id, utent.ut_line + 3, sizeof utent.ut_id); strncpy (utent.ut_id, line + 3, sizeof utent.ut_id);
strcpy (utent.ut_user, "LOGIN"); strcpy (utent.ut_user, "LOGIN");
utent.ut_time = time (NULL); utent.ut_time = time (NULL);
} }
/* Sanitize / set the ut_line field */
strncpy (utent.ut_line, line, sizeof utent.ut_line);
} }
#elif defined(LOGIN_PROCESS) #elif defined(LOGIN_PROCESS)