=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/chpass/field.c,v retrieving revision 1.6 retrieving revision 1.7 diff -c -r1.6 -r1.7 *** src/usr.bin/chpass/field.c 2003/07/01 01:01:28 1.6 --- src/usr.bin/chpass/field.c 2004/07/05 18:47:49 1.7 *************** *** 1,4 **** ! /* $OpenBSD: field.c,v 1.6 2003/07/01 01:01:28 avsm Exp $ */ /* $NetBSD: field.c,v 1.3 1995/03/26 04:55:28 glass Exp $ */ /* --- 1,4 ---- ! /* $OpenBSD: field.c,v 1.7 2004/07/05 18:47:49 millert Exp $ */ /* $NetBSD: field.c,v 1.3 1995/03/26 04:55:28 glass Exp $ */ /* *************** *** 34,40 **** #if 0 static char sccsid[] = "@(#)field.c 8.4 (Berkeley) 4/2/94"; #else ! static char rcsid[] = "$OpenBSD: field.c,v 1.6 2003/07/01 01:01:28 avsm Exp $"; #endif #endif /* not lint */ --- 34,40 ---- #if 0 static char sccsid[] = "@(#)field.c 8.4 (Berkeley) 4/2/94"; #else ! static char rcsid[] = "$OpenBSD: field.c,v 1.7 2004/07/05 18:47:49 millert Exp $"; #endif #endif /* not lint */ *************** *** 57,62 **** --- 57,64 ---- int p_login(char *p, struct passwd *pw, ENTRY *ep) { + struct passwd *tpw; + if (!*p) { warnx("empty login field"); return (1); *************** *** 65,70 **** --- 67,77 ---- warnx("login names may not begin with a hyphen"); return (1); } + /* XXX - what about truncated names? */ + if (strcmp(pw->pw_name, p) != 0 && (tpw = getpwnam(p)) != NULL) { + warnx("login %s already exists", p); + return (1); + } if (!(pw->pw_name = strdup(p))) { warnx("can't save entry"); return (1); *************** *** 98,119 **** p_uid(char *p, struct passwd *pw, ENTRY *ep) { uid_t id; ! char *np; if (!*p) { warnx("empty uid field"); return (1); } ! if (!isdigit(*p)) { ! warnx("illegal uid"); return (1); } - errno = 0; - id = strtoul(p, &np, 10); - if (*np || (id == ULONG_MAX && errno == ERANGE)) { - warnx("illegal uid"); - return (1); - } pw->pw_uid = id; return (0); } --- 105,121 ---- p_uid(char *p, struct passwd *pw, ENTRY *ep) { uid_t id; ! const char *errstr; if (!*p) { warnx("empty uid field"); return (1); } ! id = strtonum(p, 0, UID_MAX, &errstr); ! if (errstr) { ! warnx("uid is %s", errstr); return (1); } pw->pw_uid = id; return (0); } *************** *** 123,130 **** p_gid(char *p, struct passwd *pw, ENTRY *ep) { struct group *gr; gid_t id; - char *np; if (!*p) { warnx("empty gid field"); --- 125,132 ---- p_gid(char *p, struct passwd *pw, ENTRY *ep) { struct group *gr; + const char *errstr; gid_t id; if (!*p) { warnx("empty gid field"); *************** *** 138,147 **** pw->pw_gid = gr->gr_gid; return (0); } ! errno = 0; ! id = strtoul(p, &np, 10); ! if (*np || (id == ULONG_MAX && errno == ERANGE)) { ! warnx("illegal gid"); return (1); } pw->pw_gid = id; --- 140,148 ---- pw->pw_gid = gr->gr_gid; return (0); } ! id = strtonum(p, 0, GID_MAX, &errstr); ! if (errstr) { ! warnx("gid is %s", errstr); return (1); } pw->pw_gid = id;