Skip to content

Commit

Permalink
TTY: fix atime/mtime regression
Browse files Browse the repository at this point in the history
In commit b0de59b ("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: Jiri Slaby <jslaby@suse.cz>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
  • Loading branch information
Jiri Slaby authored and torvalds committed Apr 26, 2013
1 parent 91d80a8 commit 37b7f3c
Showing 1 changed file with 16 additions and 2 deletions.
18 changes: 16 additions & 2 deletions drivers/tty/tty_io.c
Original file line number Diff line number Diff line change
Expand Up @@ -941,6 +941,14 @@ void start_tty(struct tty_struct *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
* @file: pointer to tty file
Expand All @@ -960,10 +968,11 @@ static ssize_t tty_read(struct file *file, char __user *buf, size_t count,
loff_t *ppos)
{
int i;
struct inode *inode = file_inode(file);
struct tty_struct *tty = file_tty(file);
struct tty_ldisc *ld;

if (tty_paranoia_check(tty, file_inode(file), "tty_read"))
if (tty_paranoia_check(tty, inode, "tty_read"))
return -EIO;
if (!tty || (test_bit(TTY_IO_ERROR, &tty->flags)))
return -EIO;
Expand All @@ -977,6 +986,9 @@ static ssize_t tty_read(struct file *file, char __user *buf, size_t count,
i = -EIO;
tty_ldisc_deref(ld);

if (i > 0)
tty_update_time(&inode->i_atime);

return i;
}

Expand Down Expand Up @@ -1077,8 +1089,10 @@ static inline ssize_t do_tty_write(
break;
cond_resched();
}
if (written)
if (written) {
tty_update_time(&file_inode(file)->i_mtime);
ret = written;
}
out:
tty_write_unlock(tty);
return ret;
Expand Down

0 comments on commit 37b7f3c

Please sign in to comment.