X-Git-Url: https://git.cameronkatri.com/pw-darwin.git/blobdiff_plain/04d1b23be991cae809ac39645d9ac7341ec74885..1bcc04152afcff0ed7b48bc1b11b45519599da5d:/chpass/field.c diff --git a/chpass/field.c b/chpass/field.c index 264cf08..eac5561 100644 --- a/chpass/field.c +++ b/chpass/field.c @@ -1,6 +1,13 @@ /* * Copyright (c) 1988, 1993, 1994 * The Regents of the University of California. All rights reserved. + * Copyright (c) 2002 Networks Associates Technology, Inc. + * All rights reserved. + * + * Portions of this software were developed for the FreeBSD Project by + * ThinkSec AS and NAI Labs, the Security Research Division of Network + * Associates, Inc. under DARPA/SPAWAR contract N66001-01-C-8035 + * ("CBOSS"), as part of the DARPA CHATS research program. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -31,9 +38,11 @@ * SUCH DAMAGE. */ +#if 0 #ifndef lint -static const char sccsid[] = "@(#)field.c 8.4 (Berkeley) 4/2/94"; +static char sccsid[] = "@(#)field.c 8.4 (Berkeley) 4/2/94"; #endif /* not lint */ +#endif #include __FBSDID("$FreeBSD$"); @@ -45,16 +54,12 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include -#include #include #include -#include #include "chpass.h" -#include "pathnames.h" - -static char blank[] = ""; /* ARGSUSED */ int @@ -62,15 +67,15 @@ p_login(char *p, struct passwd *pw, ENTRY *ep __unused) { if (!*p) { warnx("empty login field"); - return (1); + return (-1); } if (*p == '-') { warnx("login names may not begin with a hyphen"); - return (1); + return (-1); } if (!(pw->pw_name = strdup(p))) { warnx("can't save entry"); - return (1); + return (-1); } if (strchr(p, '.')) warnx("\'.\' is dangerous in a login name"); @@ -86,11 +91,9 @@ p_login(char *p, struct passwd *pw, ENTRY *ep __unused) int p_passwd(char *p, struct passwd *pw, ENTRY *ep __unused) { - if (!*p) - pw->pw_passwd = blank; /* "NOLOGIN"; */ - else if (!(pw->pw_passwd = strdup(p))) { + if (!(pw->pw_passwd = strdup(p))) { warnx("can't save password entry"); - return (1); + return (-1); } return (0); @@ -105,17 +108,17 @@ p_uid(char *p, struct passwd *pw, ENTRY *ep __unused) if (!*p) { warnx("empty uid field"); - return (1); + return (-1); } if (!isdigit(*p)) { warnx("illegal uid"); - return (1); + return (-1); } errno = 0; id = strtoul(p, &np, 10); - if (*np || (id == ULONG_MAX && errno == ERANGE)) { + if (*np || (id == (uid_t)ULONG_MAX && errno == ERANGE)) { warnx("illegal uid"); - return (1); + return (-1); } pw->pw_uid = id; return (0); @@ -131,21 +134,21 @@ p_gid(char *p, struct passwd *pw, ENTRY *ep __unused) if (!*p) { warnx("empty gid field"); - return (1); + return (-1); } if (!isdigit(*p)) { if (!(gr = getgrnam(p))) { warnx("unknown group %s", p); - return (1); + return (-1); } pw->pw_gid = gr->gr_gid; return (0); } errno = 0; id = strtoul(p, &np, 10); - if (*np || (id == ULONG_MAX && errno == ERANGE)) { + if (*np || (id == (uid_t)ULONG_MAX && errno == ERANGE)) { warnx("illegal gid"); - return (1); + return (-1); } pw->pw_gid = id; return (0); @@ -155,11 +158,9 @@ p_gid(char *p, struct passwd *pw, ENTRY *ep __unused) int p_class(char *p, struct passwd *pw, ENTRY *ep __unused) { - if (!*p) - pw->pw_class = blank; - else if (!(pw->pw_class = strdup(p))) { + if (!(pw->pw_class = strdup(p))) { warnx("can't save entry"); - return (1); + return (-1); } return (0); @@ -172,7 +173,7 @@ p_change(char *p, struct passwd *pw, ENTRY *ep __unused) if (!atot(p, &pw->pw_change)) return (0); warnx("illegal date for change field"); - return (1); + return (-1); } /* ARGSUSED */ @@ -182,18 +183,16 @@ p_expire(char *p, struct passwd *pw, ENTRY *ep __unused) if (!atot(p, &pw->pw_expire)) return (0); warnx("illegal date for expire field"); - return (1); + return (-1); } /* ARGSUSED */ int -p_gecos(char *p, struct passwd *pw __unused, ENTRY *ep __unused) +p_gecos(char *p, struct passwd *pw __unused, ENTRY *ep) { - if (!*p) - ep->save = blank; - else if (!(ep->save = strdup(p))) { + if (!(ep->save = strdup(p))) { warnx("can't save entry"); - return (1); + return (-1); } return (0); } @@ -204,11 +203,11 @@ p_hdir(char *p, struct passwd *pw, ENTRY *ep __unused) { if (!*p) { warnx("empty home directory field"); - return (1); + return (-1); } if (!(pw->pw_dir = strdup(p))) { warnx("can't save entry"); - return (1); + return (-1); } return (0); } @@ -217,7 +216,6 @@ p_hdir(char *p, struct passwd *pw, ENTRY *ep __unused) int p_shell(char *p, struct passwd *pw, ENTRY *ep __unused) { - char *t; struct stat sbuf; if (!*p) { @@ -225,21 +223,22 @@ p_shell(char *p, struct passwd *pw, ENTRY *ep __unused) return (0); } /* only admin can change from or to "restricted" shells */ - if (uid && pw->pw_shell && !ok_shell(pw->pw_shell)) { + if (!master_mode && pw->pw_shell && !ok_shell(pw->pw_shell)) { warnx("%s: current shell non-standard", pw->pw_shell); - return (1); + return (-1); } - if (!(t = ok_shell(p))) { - if (uid) { + if (!ok_shell(p)) { + if (!master_mode) { warnx("%s: non-standard shell", p); - return (1); + return (-1); } + pw->pw_shell = strdup(p); } else - p = t; - if (!(pw->pw_shell = strdup(p))) { + pw->pw_shell = dup_shell(p); + if (!pw->pw_shell) { warnx("can't save entry"); - return (1); + return (-1); } if (stat(pw->pw_shell, &sbuf) < 0) { if (errno == ENOENT) @@ -250,7 +249,7 @@ p_shell(char *p, struct passwd *pw, ENTRY *ep __unused) return (0); } if (!S_ISREG(sbuf.st_mode)) { - warnx("WARNING: shell '%s' is not a regular file", + warnx("WARNING: shell '%s' is not a regular file", pw->pw_shell); return (0); }