File pam_login-3.35-pts.patch of Package login
--- src/login.c
+++ src/login.c 2008-04-18 17:19:15.335806337 +0200
@@ -999,12 +999,30 @@ main (int argc, char **argv)
/* for linux, write entries in utmp and wtmp */
{
struct utmp ut;
- struct utmp *utp;
+ struct utmp *utp = NULL;
+#if (__WORDSIZE == 64 && defined __WORDSIZE_COMPAT32) || defined (__s390__)
struct timeval ut_tv;
+#endif
pid_t mypid = getpid ();
+ char * id = (ttyn != NULL) ? ttyn + strlen(_PATH_TTY) : NULL;
+ char * line = (ttyn != NULL) ? ttyn + strlen(_PATH_DEV) : NULL;
+ memset (&ut, 0, sizeof (ut));
utmpname (_PATH_UTMP);
- setutent ();
+
+ /*
+ * If used for a pseudo-terminal we're called by a network daemon.
+ * Correct the id in that case in same manner as utemper does
+ * and skip scanning for spawned inittab processes. This should
+ * also corrected in sshd construct_utmp()/construct_utmpx().
+ * Werner Fink <werner@suse.de>
+ */
+ if (line != NULL && strncmp(line, "pts/", 4) == 0)
+ {
+ id = line + 3;
+ if (strlen(id) > 4) id++;
+ goto network;
+ }
/* Find mypid in utmp.
login sometimes overwrites the runlevel entry in /var/run/utmp,
@@ -1014,51 +1032,58 @@ main (int argc, char **argv)
current runlevel).
Michael Riepe <michael@stud.uni-hannover.de>
*/
+ setutent ();
while ((utp = getutent ()))
- if (utp->ut_pid == mypid
- && utp->ut_type >= INIT_PROCESS && utp->ut_type <= DEAD_PROCESS)
- break;
+ {
+ if (utp->ut_pid != mypid)
+ continue;
+ if (utp->ut_type >= INIT_PROCESS && utp->ut_type <= DEAD_PROCESS)
+ break;
+ }
+ endutent ();
/*
* If we can't find a pre-existing entry by pid, try by line
* BSD network daemons may rely on this.
*/
- if (utp == NULL && ttyn != NULL)
+ if (utp == NULL && line != NULL)
{
- endutent ();
- setutent ();
+ network:
memset (&ut, 0, sizeof (ut));
ut.ut_type = LOGIN_PROCESS; /* XXX doesn't matter */
- strncpy (ut.ut_id, ttyn + strlen (_PATH_TTY), sizeof (ut.ut_id));
- strncpy (ut.ut_line, ttyn + strlen (_PATH_DEV), sizeof (ut.ut_line));
+ strncpy (ut.ut_id, id, sizeof (ut.ut_id));
+ strncpy (ut.ut_line, line, sizeof (ut.ut_line));
+ setutent ();
utp = getutid (&ut);
}
if (utp)
memcpy (&ut, utp, sizeof (ut));
- else /* some gettys/telnetds don't initialize utmp... */
- memset (&ut, 0, sizeof (ut));
- if (ut.ut_id[0] == 0 && ttyn != NULL)
- strncpy (ut.ut_id, ttyn + strlen (_PATH_TTY), sizeof (ut.ut_id));
+ if (ut.ut_id[0] == 0 && id != NULL)
+ strncpy (ut.ut_id, id, sizeof (ut.ut_id));
strncpy (ut.ut_user, username, sizeof (ut.ut_user));
- strncpy (ut.ut_line, ttyn + strlen (_PATH_DEV), sizeof (ut.ut_line));
- ut.ut_line[sizeof (ut.ut_line) - 1] = 0;
+ if (line != NULL)
+ strncpy (ut.ut_line, line, sizeof (ut.ut_line));
+#if (__WORDSIZE == 64 && defined __WORDSIZE_COMPAT32) || defined(__s390__)
gettimeofday (&ut_tv, NULL);
- ut.ut_tv.tv_sec = ut_tv.tv_sec;
- ut.ut_tv.tv_usec = ut_tv.tv_usec;
+ ut.ut_tv.tv_sec = (int32_t)ut_tv.tv_sec;
+ ut.ut_tv.tv_usec = (int32_t)ut_tv.tv_usec;
+#else
+ gettimeofday (&ut.ut_tv, NULL);
+#endif
ut.ut_type = USER_PROCESS;
ut.ut_pid = mypid;
if (hostname)
{
strncpy (ut.ut_host, hostname, sizeof (ut.ut_host));
- ut.ut_host[sizeof (ut.ut_host) - 1] = 0;
if (hostaddress && hostaddress->h_addr_list)
memcpy (&ut.ut_addr, hostaddress->h_addr_list[0],
sizeof (ut.ut_addr));
}
+ setutent ();
pututline (&ut);
endutent ();