svn commit: r188766 - head/usr.sbin/rpc.yppasswdd

Warner Losh imp at FreeBSD.org
Wed Feb 18 14:27:49 PST 2009


Author: imp
Date: Wed Feb 18 22:27:46 2009
New Revision: 188766
URL: http://svn.freebsd.org/changeset/base/188766

Log:
  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.

Modified:
  head/usr.sbin/rpc.yppasswdd/yppasswdd_server.c

Modified: head/usr.sbin/rpc.yppasswdd/yppasswdd_server.c
==============================================================================
--- head/usr.sbin/rpc.yppasswdd/yppasswdd_server.c	Wed Feb 18 22:17:48 2009	(r188765)
+++ head/usr.sbin/rpc.yppasswdd/yppasswdd_server.c	Wed Feb 18 22:27:46 2009	(r188766)
@@ -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_
 	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 passwo
 		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 passwo
 	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");
 		}
 	}


More information about the svn-src-head mailing list