Use an MD5 checksum to test for file changes; the previous method

of using file mtimes could result in chpasss(1) erroneously
detecting that no changes were made for non-interactive edits.

PR:		4238
Reported by:	Jens Schweikhardt <schweikh@noc.dfn.de>
Submitted by:	Daniel Hagan <dhagan@cs.vt.edu>
This commit is contained in:
Sheldon Hearn 2000-04-12 08:49:14 +00:00
parent 96e88366a2
commit b9efeafc84
2 changed files with 10 additions and 3 deletions

View File

@ -27,8 +27,8 @@ COPTS+= -DYP -I. -I${.CURDIR}/../../libexec/ypxfr \
#Some people need this, uncomment to activate #Some people need this, uncomment to activate
#COPTS+= -DRESTRICT_FULLNAME_CHANGE #COPTS+= -DRESTRICT_FULLNAME_CHANGE
DPADD= ${LIBRPCSVC} ${LIBCRYPT} DPADD= ${LIBRPCSVC} ${LIBCRYPT} ${LIBMD}
LDADD+= -lrpcsvc -lcrypt LDADD+= -lrpcsvc -lcrypt -lmd
CLEANFILES= ${GENSRCS} CLEANFILES= ${GENSRCS}

View File

@ -43,6 +43,7 @@ static const char sccsid[] = "@(#)edit.c 8.3 (Berkeley) 4/2/94";
#include <ctype.h> #include <ctype.h>
#include <err.h> #include <err.h>
#include <errno.h> #include <errno.h>
#include <md5.h>
#include <paths.h> #include <paths.h>
#include <pwd.h> #include <pwd.h>
#include <stdio.h> #include <stdio.h>
@ -65,17 +66,23 @@ edit(pw)
struct passwd *pw; struct passwd *pw;
{ {
struct stat begin, end; struct stat begin, end;
char *begin_sum, *end_sum;
for (;;) { for (;;) {
if (stat(tempname, &begin)) if (stat(tempname, &begin))
pw_error(tempname, 1, 1); pw_error(tempname, 1, 1);
begin_sum = MD5File(tempname, (char *)NULL);
pw_edit(1); pw_edit(1);
if (stat(tempname, &end)) if (stat(tempname, &end))
pw_error(tempname, 1, 1); pw_error(tempname, 1, 1);
if (begin.st_mtime == end.st_mtime) { end_sum = MD5File(tempname, (char *)NULL);
if ((begin.st_mtime == end.st_mtime) &&
(strcmp(begin_sum, end_sum) == 0)) {
warnx("no changes made"); warnx("no changes made");
pw_error(NULL, 0, 0); pw_error(NULL, 0, 0);
} }
free(begin_sum);
free(end_sum);
if (verify(pw)) if (verify(pw))
break; break;
pw_prompt(); pw_prompt();