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.
This commit is contained in:
Warner Losh 2009-02-18 22:27:46 +00:00
parent 04ff88ceac
commit 02da3f2280
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=188766

View File

@ -69,6 +69,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)
{
@ -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");
}
}