summaryrefslogtreecommitdiffstats
path: root/usr.sbin/rpc.yppasswdd
diff options
context:
space:
mode:
authormbr <mbr@FreeBSD.org>2003-06-15 10:34:11 +0000
committermbr <mbr@FreeBSD.org>2003-06-15 10:34:11 +0000
commit8b1b06a201cc7a5dcfc78a0632b124dedbe79246 (patch)
tree4c08e050713880f38015371f2222c06f71161a74 /usr.sbin/rpc.yppasswdd
parent88d25e9b2f4ea3faad69b895962410291cc44ac9 (diff)
downloadFreeBSD-src-8b1b06a201cc7a5dcfc78a0632b124dedbe79246.zip
FreeBSD-src-8b1b06a201cc7a5dcfc78a0632b124dedbe79246.tar.gz
Only call pw_mkdb if passfile == _PATH_MASTERPASSWD.
Otherwise, rename master.passwd to a temp filename, rename the new passwd to master.passwd, and let yppwupdate update passwd as it sees fit. PR: 52601, 7968 Reviewed by: des Submitted by: Dan Nelson <dnelson@allantgroup.com>
Diffstat (limited to 'usr.sbin/rpc.yppasswdd')
-rw-r--r--usr.sbin/rpc.yppasswdd/yppasswdd_server.c56
1 files changed, 47 insertions, 9 deletions
diff --git a/usr.sbin/rpc.yppasswdd/yppasswdd_server.c b/usr.sbin/rpc.yppasswdd/yppasswdd_server.c
index 1cc5322..7932753 100644
--- a/usr.sbin/rpc.yppasswdd/yppasswdd_server.c
+++ b/usr.sbin/rpc.yppasswdd/yppasswdd_server.c
@@ -448,6 +448,7 @@ yppasswdproc_update_1_svc(yppasswd *argp, struct svc_req *rqstp)
char *oldgecos = NULL;
char *passfile_hold;
char passfile_buf[MAXPATHLEN + 2];
+ char passfile_hold_buf[MAXPATHLEN + 2];
char *domain = yppasswd_domain;
static struct sockaddr_in clntaddr;
static struct timeval t_saved, t_test;
@@ -572,6 +573,15 @@ yppasswdproc_update_1_svc(yppasswd *argp, struct svc_req *rqstp)
passfile = (char *)&passfile_buf;
}
+ /*
+ * Create a filename to hold the original master.passwd
+ * so if our call to yppwupdate fails we can roll back
+ */
+ snprintf(passfile_hold_buf, sizeof(passfile_hold_buf),
+ "%s.hold", passfile);
+ passfile_hold = (char *)&passfile_hold_buf;
+
+
/* Step 5: make a new password file with the updated info. */
if (pw_init(dirname(passfile), passfile)) {
@@ -593,11 +603,38 @@ yppasswdproc_update_1_svc(yppasswd *argp, struct svc_req *rqstp)
yp_error("pw_copy() failed");
return &result;
}
- if (pw_mkdb(yp_password.pw_name) == -1) {
+ if (rename(passfile, passfile_hold) == -1) {
pw_fini();
- yp_error("pw_mkdb() failed");
+ yp_error("rename of %s to %s failed", passfile,
+ passfile_hold);
return &result;
}
+
+ if (strcmp(passfile, _PATH_MASTERPASSWD) == 0) {
+ /*
+ * NIS server is exporting the system's master.passwd.
+ * Call pw_mkdb to rebuild passwd and the .db files
+ */
+ if (pw_mkdb(yp_password.pw_name) == -1) {
+ pw_fini();
+ yp_error("pw_mkdb() failed");
+ rename(passfile_hold, passfile);
+ return &result;
+ }
+ } else {
+ /*
+ * NIS server is exporting a private master.passwd.
+ * Rename tempfile into final location
+ */
+ if (rename(pw_tempname(), passfile) == -1) {
+ pw_fini();
+ yp_error("rename of %s to %s failed",
+ pw_tempname(), passfile);
+ rename(passfile_hold, passfile);
+ return &result;
+ }
+ }
+
pw_fini();
if (inplace) {
@@ -633,9 +670,8 @@ yppasswdproc_update_1_svc(yppasswd *argp, struct svc_req *rqstp)
}
if (verbose) {
- yp_error("update completed for user %s (uid %d):",
- argp->newpw.pw_name,
- argp->newpw.pw_uid);
+ yp_error("update completed for user %s (uid %d) in %s:",
+ argp->newpw.pw_name, argp->newpw.pw_uid, passfile);
if (passwd_changed)
yp_error("password changed");
@@ -780,10 +816,12 @@ allow additions to be made to the password database");
yp_error("pw_copy() failed");
return &result;
}
- if (pw_mkdb(argp->newpw.pw_name) == -1) {
- pw_fini();
- yp_error("pw_mkdb() failed");
- return &result;
+ if (strcmp(passfile, _PATH_MASTERPASSWD) == 0) {
+ if (pw_mkdb(argp->newpw.pw_name) == -1) {
+ pw_fini();
+ yp_error("pw_mkdb() failed");
+ return &result;
+ }
}
pw_fini();
OpenPOWER on IntegriCloud