Commit 37b7f3c7 authored by Jiri Slaby's avatar Jiri Slaby Committed by Linus Torvalds

TTY: fix atime/mtime regression

In commit b0de59b5 ("TTY: do not update atime/mtime on read/write")
we removed timestamps from tty inodes to fix a security issue and waited
if something breaks.  Well, 'w', the utility to find out logged users
and their inactivity time broke.  It shows that users are inactive since
the time they logged in.

To revert to the old behaviour while still preventing attackers to
guess the password length, we update the timestamps in one-minute
intervals by this patch.
Signed-off-by: default avatarJiri Slaby <jslaby@suse.cz>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 91d80a84
...@@ -941,6 +941,14 @@ void start_tty(struct tty_struct *tty) ...@@ -941,6 +941,14 @@ void start_tty(struct tty_struct *tty)
EXPORT_SYMBOL(start_tty); EXPORT_SYMBOL(start_tty);
static void tty_update_time(struct timespec *time)
{
unsigned long sec = get_seconds();
sec -= sec % 60;
if ((long)(sec - time->tv_sec) > 0)
time->tv_sec = sec;
}
/** /**
* tty_read - read method for tty device files * tty_read - read method for tty device files
* @file: pointer to tty file * @file: pointer to tty file
...@@ -960,10 +968,11 @@ static ssize_t tty_read(struct file *file, char __user *buf, size_t count, ...@@ -960,10 +968,11 @@ static ssize_t tty_read(struct file *file, char __user *buf, size_t count,
loff_t *ppos) loff_t *ppos)
{ {
int i; int i;
struct inode *inode = file_inode(file);
struct tty_struct *tty = file_tty(file); struct tty_struct *tty = file_tty(file);
struct tty_ldisc *ld; struct tty_ldisc *ld;
if (tty_paranoia_check(tty, file_inode(file), "tty_read")) if (tty_paranoia_check(tty, inode, "tty_read"))
return -EIO; return -EIO;
if (!tty || (test_bit(TTY_IO_ERROR, &tty->flags))) if (!tty || (test_bit(TTY_IO_ERROR, &tty->flags)))
return -EIO; return -EIO;
...@@ -977,6 +986,9 @@ static ssize_t tty_read(struct file *file, char __user *buf, size_t count, ...@@ -977,6 +986,9 @@ static ssize_t tty_read(struct file *file, char __user *buf, size_t count,
i = -EIO; i = -EIO;
tty_ldisc_deref(ld); tty_ldisc_deref(ld);
if (i > 0)
tty_update_time(&inode->i_atime);
return i; return i;
} }
...@@ -1077,8 +1089,10 @@ static inline ssize_t do_tty_write( ...@@ -1077,8 +1089,10 @@ static inline ssize_t do_tty_write(
break; break;
cond_resched(); cond_resched();
} }
if (written) if (written) {
tty_update_time(&file_inode(file)->i_mtime);
ret = written; ret = written;
}
out: out:
tty_write_unlock(tty); tty_write_unlock(tty);
return ret; return ret;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment