]> git.cameronkatri.com Git - pw-darwin.git/commitdiff
Use an MD5 checksum to test for file changes; the previous method
authorSheldon Hearn <sheldonh@FreeBSD.org>
Wed, 12 Apr 2000 08:49:14 +0000 (08:49 +0000)
committerSheldon Hearn <sheldonh@FreeBSD.org>
Wed, 12 Apr 2000 08:49:14 +0000 (08:49 +0000)
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>

chpass/Makefile
chpass/edit.c

index 6e26143ad06afc972eb61ddc8635ea808184367f..7966608938ceec2d2f96b9916e5bd30df93c879f 100644 (file)
@@ -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}
 
index a8c5cc2c76c4ee6c0d6e76653e0a9c85088957aa..6311d5751508d55d816544b43f2da6b51ee214cb 100644 (file)
@@ -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();