Date: Wed, 25 Mar 1998 03:40:01 -0800 (PST) From: Stephen McKay <syssgm@dtir.qld.gov.au> To: freebsd-bugs Subject: Re: bin/6124: Getting md5 to reset access times. Message-ID: <199803251140.DAA23425@hub.freebsd.org>
index | next in thread | raw e-mail
The following reply was made to PR bin/6124; it has been noted by GNATS.
From: Stephen McKay <syssgm@dtir.qld.gov.au>
To: freebsd-gnats-submit@freebsd.org
Cc: syssgm@dtir.qld.gov.au
Subject: Re: bin/6124: Getting md5 to reset access times.
Date: Wed, 25 Mar 1998 21:31:39 +1000
On Wednesday, 25th March 1998, David Malone wrote:
> If you are using md5 to checksum a load of files you probably
> don't want all the access times changed. This is a small patch
> which adds a "-r" flag which resets the access times to what
> they were before the file was checksumed.
The updated manual page should point out that resetting the access time
updates the inode change time. For me the inode change time is much
more interesting than the access time since dump checks ctime as well as
mtime to determine if a file has changed, and since hackers leave more
interesting footprints in ctime stamps than atime stamps.
And that's where the story should stop, except I found interesting stuff
when verifying my facts for this note. FreeBSD allows a user to set an
arbitrary access time on a file without disturbing the mtime or ctime!
To do this, pass -1 for the mtime in utime(). That translates to
setting tv_sec = -1 in the appropriate element for utimes().
This works because VNOVAL == -1 and ufs_setattr() in ufs_vnops.c sets
IN_ACCESS (since atime.tv_sec != VNOVAL) but not IN_CHANGE and IN_UPDATE
(because mtime.tv_sec == VNOVAL). Thus, ffs_update() will happily set
the access time to the specified value and leave the other two time
stamps alone.
So, is this a bug like I think it is? It doesn't work like this under
Solaris or Digital Unix. Is it a security hole? I can't think of an
exploit yet...
Regardless, the utime and utimes manual pages need some updating, which
I'm happy to do once the proper behaviour is defined.
>+ if( times_ok ) {
>+ TIMESPEC_TO_TIMEVAL(&tv[0], &sb.st_atimespec);
>+ TIMESPEC_TO_TIMEVAL(&tv[1], &sb.st_mtimespec);
>+
>+ utimes(argv[optind],tv);
>+ }
This interesting use of TIMESPEC_TO_TIMEVAL may be of value in the future,
but ffs_update() only uses the tv_sec portion, and throws the rest away.
Stephen.
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message
help
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199803251140.DAA23425>
