I changed my mind and decided it is better to just move the chown
and chmod out of copydotfiles() and add an explicit check for skeldir
set to the empty string.  Much as I would like to prettify the
user.c code it is a losing battle so here is a minimal diff.

 - todd

Index: usr.sbin/user/user.c
===================================================================
RCS file: /home/cvs/openbsd/src/usr.sbin/user/user.c,v
retrieving revision 1.95
diff -u -r1.95 user.c
--- usr.sbin/user/user.c        2 Apr 2013 05:04:47 -0000       1.95
+++ usr.sbin/user/user.c        5 Sep 2013 20:47:23 -0000
@@ -290,6 +290,8 @@
        DIR             *dirp;
        int             n;
 
+       if (*skeldir != '\0')
+               return 0;
        if ((dirp = opendir(skeldir)) == NULL) {
                warn("can't open source . files dir `%s'", skeldir);
                return 0;
@@ -308,8 +310,6 @@
                (void) asystem("cd %s && %s -rw -pe %s . %s",
                                skeldir, PAX, (verbose) ? "-v" : "", dir);
        }
-       (void) asystem("%s -R -P %u:%u %s", CHOWN, uid, gid, dir);
-       (void) asystem("%s -R u+w %s", CHMOD, dir);
        return n;
 }
 
@@ -1177,6 +1177,9 @@
                                err(EXIT_FAILURE, "can't mkdir `%s'", home);
                        }
                        (void) copydotfiles(up->u_skeldir, up->u_uid, gid, 
home);
+                       (void) asystem("%s -R -P %u:%u %s", CHOWN, up->u_uid,
+                           gid, home);
+                       (void) asystem("%s -R u+w %s", CHMOD, home);
                }
        }
        if (strcmp(up->u_primgrp, "=uid") == 0 &&

Reply via email to