summaryrefslogtreecommitdiffstats
path: root/usr.sbin/rpc.yppasswdd
diff options
context:
space:
mode:
authormbr <mbr@FreeBSD.org>2003-06-15 21:24:45 +0000
committermbr <mbr@FreeBSD.org>2003-06-15 21:24:45 +0000
commitd1edf6fb0eef6529331786e891d80e88e426f00b (patch)
tree67b68a008e504b77f76c01849ce78cf1061a3ea5 /usr.sbin/rpc.yppasswdd
parentd84237dcb71f2ea38af079116184daf4c746ebcb (diff)
downloadFreeBSD-src-d1edf6fb0eef6529331786e891d80e88e426f00b.zip
FreeBSD-src-d1edf6fb0eef6529331786e891d80e88e426f00b.tar.gz
Fix yppasswdproc_update_master_1_svc() too.
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. Reviewed by: phk Tested by: genesys
Diffstat (limited to 'usr.sbin/rpc.yppasswdd')
-rw-r--r--usr.sbin/rpc.yppasswdd/yppasswdd_server.c32
1 files changed, 32 insertions, 0 deletions
diff --git a/usr.sbin/rpc.yppasswdd/yppasswdd_server.c b/usr.sbin/rpc.yppasswdd/yppasswdd_server.c
index 7932753..04adf31 100644
--- a/usr.sbin/rpc.yppasswdd/yppasswdd_server.c
+++ b/usr.sbin/rpc.yppasswdd/yppasswdd_server.c
@@ -706,6 +706,7 @@ yppasswdproc_update_master_1_svc(master_yppasswd *argp,
DBT key, data;
char *passfile_hold;
char passfile_buf[MAXPATHLEN + 2];
+ char passfile_hold_buf[MAXPATHLEN + 2];
struct sockaddr_in *rqhost;
SVCXPRT *transp;
@@ -797,6 +798,14 @@ allow additions to be made to the password database");
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;
+
if (pw_init(dirname(passfile), passfile)) {
yp_error("pw_init() failed");
return &result;
@@ -816,10 +825,33 @@ allow additions to be made to the password database");
yp_error("pw_copy() failed");
return &result;
}
+ if (rename(passfile, passfile_hold) == -1) {
+ pw_fini();
+ 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(argp->newpw.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;
}
}
OpenPOWER on IntegriCloud