Commit f0bf0bd07943bfde8f5ac39a32664810a379c7d3

Authored by Jiri Slaby
Committed by Greg Kroah-Hartman
1 parent dfd37668ea

tty: fix up atime/mtime mess, take four

This problem was taken care of three times already in
* b0de59b5733d18b0d1974a060860a8b5c1b36a2e (TTY: do not update
  atime/mtime on read/write),
* 37b7f3c76595e23257f61bd80b223de8658617ee (TTY: fix atime/mtime
  regression), and
* b0b885657b6c8ef63a46bc9299b2a7715d19acde (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: Jiri Slaby <jslaby@suse.cz>
Reported-by: John Paul Perry <john_paul.perry@alcatel-lucent.com>
Cc: <stable@vger.kernel.org> # all, as b0b885657 was backported
Acked-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

Showing 1 changed file with 2 additions and 2 deletions Side-by-side Diff

drivers/tty/tty_io.c
... ... @@ -1028,8 +1028,8 @@
1028 1028 /* We limit tty time update visibility to every 8 seconds or so. */
1029 1029 static void tty_update_time(struct timespec *time)
1030 1030 {
1031   - unsigned long sec = get_seconds() & ~7;
1032   - if ((long)(sec - time->tv_sec) > 0)
  1031 + unsigned long sec = get_seconds();
  1032 + if (abs(sec - time->tv_sec) & ~7)
1033 1033 time->tv_sec = sec;
1034 1034 }
1035 1035