| From 37b7f3c76595e23257f61bd80b223de8658617ee Mon Sep 17 00:00:00 2001 |
| From: Jiri Slaby <jslaby@suse.cz> |
| Date: Fri, 26 Apr 2013 13:48:53 +0200 |
| Subject: TTY: fix atime/mtime regression |
| |
| From: Jiri Slaby <jslaby@suse.cz> |
| |
| commit 37b7f3c76595e23257f61bd80b223de8658617ee upstream. |
| |
| In commit b0de59b5733d ("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> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/tty/tty_io.c | 16 +++++++++++++++- |
| 1 file changed, 15 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/tty/tty_io.c |
| +++ b/drivers/tty/tty_io.c |
| @@ -938,6 +938,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 |
| @@ -975,6 +983,9 @@ static ssize_t tty_read(struct file *fil |
| i = -EIO; |
| tty_ldisc_deref(ld); |
| |
| + if (i > 0) |
| + tty_update_time(&inode->i_atime); |
| + |
| return i; |
| } |
| |
| @@ -1075,8 +1086,11 @@ static inline ssize_t do_tty_write( |
| break; |
| cond_resched(); |
| } |
| - if (written) |
| + if (written) { |
| + struct inode *inode = file->f_path.dentry->d_inode; |
| + tty_update_time(&inode->i_mtime); |
| ret = written; |
| + } |
| out: |
| tty_write_unlock(tty); |
| return ret; |