summaryrefslogtreecommitdiffstats
path: root/pw/pw_user.c
diff options
context:
space:
mode:
authorGlen Barber <gjb@FreeBSD.org>2016-01-04 19:19:48 +0000
committerGlen Barber <gjb@FreeBSD.org>2016-01-04 19:19:48 +0000
commit403307ec3a577cd210c8241520fd8c7b3fd4fc5a (patch)
treecf36692dbaeeac0cf3eacb291f4ede63f9fa902c /pw/pw_user.c
parent470cc19f86d5b729b81d5fc775fc96e8b01180c5 (diff)
parent41aabc08b56276751e6538be1017556a832dc05a (diff)
downloadpw-darwin-403307ec3a577cd210c8241520fd8c7b3fd4fc5a.tar.gz
pw-darwin-403307ec3a577cd210c8241520fd8c7b3fd4fc5a.zip
MFH r289384-r293170
Sponsored by: The FreeBSD Foundation
Diffstat (limited to 'pw/pw_user.c')
-rw-r--r--pw/pw_user.c27
1 files changed, 17 insertions, 10 deletions
diff --git a/pw/pw_user.c b/pw/pw_user.c
index 1af8f81..30a2749 100644
--- a/pw/pw_user.c
+++ b/pw/pw_user.c
@@ -107,8 +107,10 @@ mkdir_home_parents(int dfd, const char *dir)
errx(EX_UNAVAILABLE, "out of memory");
tmp = strrchr(dirs, '/');
- if (tmp == NULL)
+ if (tmp == NULL) {
+ free(dirs);
return;
+ }
tmp[0] = '\0';
/*
@@ -272,7 +274,7 @@ pw_userlock(char *arg1, int mode)
char *passtmp = NULL;
char *name;
bool locked = false;
- uid_t id;
+ uid_t id = (uid_t)-1;
if (geteuid() != 0)
errx(EX_NOPERM, "you must be root");
@@ -280,15 +282,19 @@ pw_userlock(char *arg1, int mode)
if (arg1 == NULL)
errx(EX_DATAERR, "username or id required");
- if (arg1[strspn(arg1, "0123456789")] == '\0')
- id = pw_checkid(arg1, UID_MAX);
- else
- name = arg1;
+ name = arg1;
+ if (arg1[strspn(name, "0123456789")] == '\0')
+ id = pw_checkid(name, UID_MAX);
- pwd = (name != NULL) ? GETPWNAM(pw_checkname(name, 0)) : GETPWUID(id);
+ pwd = GETPWNAM(pw_checkname(name, 0));
+ if (pwd == NULL && id != (uid_t)-1) {
+ pwd = GETPWUID(id);
+ if (pwd != NULL)
+ name = pwd->pw_name;
+ }
if (pwd == NULL) {
- if (name == NULL)
- errx(EX_NOUSER, "no such uid `%ju'", (uintmax_t) id);
+ if (id == (uid_t)-1)
+ errx(EX_NOUSER, "no such name or uid `%ju'", (uintmax_t) id);
errx(EX_NOUSER, "no such user `%s'", name);
}
@@ -636,7 +642,8 @@ pw_checkname(char *name, int gecos)
}
if (!reject) {
while (*ch) {
- if (strchr(badchars, *ch) != NULL || *ch < ' ' ||
+ if (strchr(badchars, *ch) != NULL ||
+ (!gecos && *ch < ' ') ||
*ch == 127) {
reject = 1;
break;