summaryrefslogtreecommitdiffstats
path: root/usr.sbin/rpc.yppasswdd
diff options
context:
space:
mode:
authorimp <imp@FreeBSD.org>2009-02-18 22:27:46 +0000
committerimp <imp@FreeBSD.org>2009-02-18 22:27:46 +0000
commit0fb502363da4e75e8b1331d5d43a16187311e6e5 (patch)
tree431549b251c3afc333b4410eb2224cf32fa09ba9 /usr.sbin/rpc.yppasswdd
parentf10246717a6419e9755a0fbdd0a21da8b769c8f9 (diff)
downloadFreeBSD-src-0fb502363da4e75e8b1331d5d43a16187311e6e5.zip
FreeBSD-src-0fb502363da4e75e8b1331d5d43a16187311e6e5.tar.gz
yppasswdd assumed that a struct x_master_passwd is type punable to a
struct passwd. This is not the case when sizeof(unsigned long) != sizeof(time_t). Write a dinky function to do the assignment instead of relying on the punning. This does slow things down a little (1 extra function call, 11 pointer or int assignments), but is much safer and machines have been fast enough since the mid 1990s that nobody will notice the difference. time_t is a 64-bits int on arm and mips. Before this change, arm was silently broken. I guess there aren't that many ARM machines running master YP domain servers. :) The client side doesn't assume this type punning, so it doesn't need to be fixed.
Diffstat (limited to 'usr.sbin/rpc.yppasswdd')
-rw-r--r--usr.sbin/rpc.yppasswdd/yppasswdd_server.c24
1 files changed, 21 insertions, 3 deletions
diff --git a/usr.sbin/rpc.yppasswdd/yppasswdd_server.c b/usr.sbin/rpc.yppasswdd/yppasswdd_server.c
index 04adf31..446b130 100644
--- a/usr.sbin/rpc.yppasswdd/yppasswdd_server.c
+++ b/usr.sbin/rpc.yppasswdd/yppasswdd_server.c
@@ -70,6 +70,22 @@ struct dom_binding;
static struct passwd yp_password;
static void
+xlate_passwd(struct x_master_passwd *xpwd, struct passwd *pwd)
+{
+ pwd->pw_name = xpwd->pw_name;
+ pwd->pw_passwd = xpwd->pw_passwd;
+ pwd->pw_uid = xpwd->pw_uid;
+ pwd->pw_gid = xpwd->pw_gid;
+ pwd->pw_change = xpwd->pw_change;
+ pwd->pw_class = xpwd->pw_class;
+ pwd->pw_gecos = xpwd->pw_gecos;
+ pwd->pw_dir = xpwd->pw_dir;
+ pwd->pw_shell = xpwd->pw_shell;
+ pwd->pw_expire = xpwd->pw_expire;
+ pwd->pw_fields = xpwd->pw_fields;
+}
+
+static void
copy_yp_pass(char *p, int x, int m)
{
char *t, *s = p;
@@ -709,6 +725,7 @@ yppasswdproc_update_master_1_svc(master_yppasswd *argp,
char passfile_hold_buf[MAXPATHLEN + 2];
struct sockaddr_in *rqhost;
SVCXPRT *transp;
+ struct passwd newpasswd;
result = 1;
transp = rqstp->rq_xprt;
@@ -820,7 +837,8 @@ allow additions to be made to the password database");
yp_error("pw_tmp() failed");
return &result;
}
- if (pw_copy(pfd, tfd, (struct passwd *)&argp->newpw, NULL) == -1) {
+ xlate_passwd(&argp->newpw, &newpasswd);
+ if (pw_copy(pfd, tfd, &newpasswd, NULL) == -1) {
pw_fini();
yp_error("pw_copy() failed");
return &result;
@@ -858,8 +876,8 @@ allow additions to be made to the password database");
pw_fini();
if (inplace) {
- if ((rval = update_inplace((struct passwd *)&argp->newpw,
- argp->domain))) {
+ xlate_passwd(&argp->newpw, &newpasswd);
+ if ((rval = update_inplace(&newpasswd, argp->domain))) {
yp_error("inplace update failed -- rebuilding maps");
}
}
OpenPOWER on IntegriCloud