From aac9512fc5b3f9778521d63eb8530e533bc65447 Mon Sep 17 00:00:00 2001 From: "Todd C. Miller" Date: Sat, 17 Nov 2007 16:09:30 +0000 Subject: Deal with timespec vs. timeval precision issues. Fixes a problem where the "no changes" case was not properly detected due to timespec supporting nanosec resolution but timeval only supporting microsec resolution. OK deraadt@ --- usr.sbin/cron/crontab.c | 10 +++++++--- usr.sbin/vipw/vipw.c | 5 ++++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/usr.sbin/cron/crontab.c b/usr.sbin/cron/crontab.c index f89b324b739..b2c97e84b82 100644 --- a/usr.sbin/cron/crontab.c +++ b/usr.sbin/cron/crontab.c @@ -1,4 +1,4 @@ -/* $OpenBSD: crontab.c,v 1.54 2007/10/17 20:02:33 deraadt Exp $ */ +/* $OpenBSD: crontab.c,v 1.55 2007/11/17 16:09:29 millert Exp $ */ /* Copyright 1988,1990,1993,1994 by Paul Vixie * All rights reserved @@ -21,7 +21,7 @@ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -static char const rcsid[] = "$OpenBSD: crontab.c,v 1.54 2007/10/17 20:02:33 deraadt Exp $"; +static char const rcsid[] = "$OpenBSD: crontab.c,v 1.55 2007/11/17 16:09:29 millert Exp $"; /* crontab - install and manage per-user crontab files * vix 02may87 [RCS has the rest of the log] @@ -311,9 +311,13 @@ edit_cmd(void) { perror("fstat"); goto fatal; } - memcpy(&mtimespec, &statbuf.st_mtimespec, sizeof(mtimespec)); + /* + * Note that timespec has higher precision than timeval so we + * store mtimespec using timeval precision so we can compare later. + */ TIMESPEC_TO_TIMEVAL(&tv[0], &statbuf.st_atimespec); TIMESPEC_TO_TIMEVAL(&tv[1], &statbuf.st_mtimespec); + TIMEVAL_TO_TIMESPEC(&tv[1], &mtimespec); /* Turn off signals. */ (void)signal(SIGHUP, SIG_IGN); diff --git a/usr.sbin/vipw/vipw.c b/usr.sbin/vipw/vipw.c index 3b8debb7e57..012800221e6 100644 --- a/usr.sbin/vipw/vipw.c +++ b/usr.sbin/vipw/vipw.c @@ -1,4 +1,4 @@ -/* $OpenBSD: vipw.c,v 1.13 2003/06/02 23:36:55 millert Exp $ */ +/* $OpenBSD: vipw.c,v 1.14 2007/11/17 16:09:29 millert Exp $ */ /* * Copyright (c) 1987, 1993, 1994 @@ -119,6 +119,9 @@ copyfile(int from, int to, struct stat *sb) TIMESPEC_TO_TIMEVAL(&tv[0], &sb->st_atimespec); TIMESPEC_TO_TIMEVAL(&tv[1], &sb->st_mtimespec); (void)futimes(to, tv); + + /* Make tv_nsec the same precision as tv_usec so it compares OK. */ + TIMEVAL_TO_TIMESPEC(&tv[1], &sb->st_mtimespec); } void -- cgit v1.2.3