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 &&