summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsheldonh <sheldonh@FreeBSD.org>2000-04-12 08:49:14 +0000
committersheldonh <sheldonh@FreeBSD.org>2000-04-12 08:49:14 +0000
commit0875731adbb850a030b3ece2c3b7ef9da01be535 (patch)
treeb2111d2d560d21e33b640d283fd11184fa3aedea
parenta365f1d25ae787ba1aca5aceb5aa846ab9c3f290 (diff)
downloadFreeBSD-src-0875731adbb850a030b3ece2c3b7ef9da01be535.zip
FreeBSD-src-0875731adbb850a030b3ece2c3b7ef9da01be535.tar.gz
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>
-rw-r--r--usr.bin/chpass/Makefile4
-rw-r--r--usr.bin/chpass/edit.c9
2 files changed, 10 insertions, 3 deletions
diff --git a/usr.bin/chpass/Makefile b/usr.bin/chpass/Makefile
index 6e26143..7966608 100644
--- a/usr.bin/chpass/Makefile
+++ b/usr.bin/chpass/Makefile
@@ -27,8 +27,8 @@ COPTS+= -DYP -I. -I${.CURDIR}/../../libexec/ypxfr \
#Some people need this, uncomment to activate
#COPTS+= -DRESTRICT_FULLNAME_CHANGE
-DPADD= ${LIBRPCSVC} ${LIBCRYPT}
-LDADD+= -lrpcsvc -lcrypt
+DPADD= ${LIBRPCSVC} ${LIBCRYPT} ${LIBMD}
+LDADD+= -lrpcsvc -lcrypt -lmd
CLEANFILES= ${GENSRCS}
diff --git a/usr.bin/chpass/edit.c b/usr.bin/chpass/edit.c
index a8c5cc2..6311d575 100644
--- a/usr.bin/chpass/edit.c
+++ b/usr.bin/chpass/edit.c
@@ -43,6 +43,7 @@ static const char sccsid[] = "@(#)edit.c 8.3 (Berkeley) 4/2/94";
#include <ctype.h>
#include <err.h>
#include <errno.h>
+#include <md5.h>
#include <paths.h>
#include <pwd.h>
#include <stdio.h>
@@ -65,17 +66,23 @@ edit(pw)
struct passwd *pw;
{
struct stat begin, end;
+ char *begin_sum, *end_sum;
for (;;) {
if (stat(tempname, &begin))
pw_error(tempname, 1, 1);
+ begin_sum = MD5File(tempname, (char *)NULL);
pw_edit(1);
if (stat(tempname, &end))
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");
pw_error(NULL, 0, 0);
}
+ free(begin_sum);
+ free(end_sum);
if (verify(pw))
break;
pw_prompt();
OpenPOWER on IntegriCloud