Commit c468bf26 authored by Jiri Slaby's avatar Jiri Slaby Committed by Luis Henriques

tty: fix up atime/mtime mess, take four

commit f0bf0bd0 upstream.

This problem was taken care of three times already in
* b0de59b5 (TTY: do not update
  atime/mtime on read/write),
* 37b7f3c7 (TTY: fix atime/mtime
  regression), and
* b0b88565 (tty: fix up atime/mtime
  mess, take three)

But it still misses one point. As John Paul correctly points out, we
do not care about setting date. If somebody ever changes wall
time backwards (by mistake for example), tty timestamps are never
updated until the original wall time passes.

So check the absolute difference of times and if it large than "8
seconds or so", always update the time. That means we will update
immediatelly when changing time. Ergo, CAP_SYS_TIME can foul the
check, but it was always that way.

Thanks John for serving me this so nicely debugged.
Signed-off-by: default avatarJiri Slaby <jslaby@suse.cz>
Reported-by: default avatarJohn Paul Perry <john_paul.perry@alcatel-lucent.com>
Acked-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: default avatarLuis Henriques <luis.henriques@canonical.com>
parent 5b428ea8
...@@ -996,8 +996,8 @@ EXPORT_SYMBOL(start_tty); ...@@ -996,8 +996,8 @@ EXPORT_SYMBOL(start_tty);
/* We limit tty time update visibility to every 8 seconds or so. */ /* We limit tty time update visibility to every 8 seconds or so. */
static void tty_update_time(struct timespec *time) static void tty_update_time(struct timespec *time)
{ {
unsigned long sec = get_seconds() & ~7; unsigned long sec = get_seconds();
if ((long)(sec - time->tv_sec) > 0) if (abs(sec - time->tv_sec) & ~7)
time->tv_sec = sec; time->tv_sec = sec;
} }
......
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