Oops. Better patch attached (damn Makefile dependencies are broken unless you manually build them via "make depend").
-- Terry
Index: pw.h =================================================================== RCS file: /cvs/src/usr.sbin/pw/pw.h,v retrieving revision 1.13 diff -c -r1.13 pw.h *** pw.h 5 Jul 2001 08:01:15 -0000 1.13 --- pw.h 27 Nov 2002 17:21:03 -0000 *************** *** 62,67 **** --- 62,74 ---- W_NUM }; + enum _checktype + { + PWC_DEFAULT, + PWC_GECOS, + PWC_LOGIN + }; + struct carg { int ch; *************** *** 105,111 **** int pw_user(struct userconf * cnf, int mode, struct cargs * _args); int pw_group(struct userconf * cnf, int mode, struct cargs * _args); ! char *pw_checkname(u_char *name, int gecos); int addpwent(struct passwd * pwd); int delpwent(struct passwd * pwd); --- 112,118 ---- int pw_user(struct userconf * cnf, int mode, struct cargs * _args); int pw_group(struct userconf * cnf, int mode, struct cargs * _args); ! char *pw_checkname(u_char *name, enum _checktype checktype); int addpwent(struct passwd * pwd); int delpwent(struct passwd * pwd); Index: pw_group.c =================================================================== RCS file: /cvs/src/usr.sbin/pw/pw_group.c,v retrieving revision 1.13 diff -c -r1.13 pw_group.c *** pw_group.c 22 Jun 2000 16:48:41 -0000 1.13 --- pw_group.c 27 Nov 2002 17:44:10 -0000 *************** *** 135,141 **** grp->gr_gid = (gid_t) atoi(a_gid->val); if ((arg = getarg(args, 'l')) != NULL) ! grp->gr_name = pw_checkname((u_char *)arg->val, 0); } else { if (a_name == NULL) /* Required */ errx(EX_DATAERR, "group name required"); --- 135,141 ---- grp->gr_gid = (gid_t) atoi(a_gid->val); if ((arg = getarg(args, 'l')) != NULL) ! grp->gr_name = pw_checkname((u_char *)arg->val, PWC_DEFAULT); } else { if (a_name == NULL) /* Required */ errx(EX_DATAERR, "group name required"); *************** *** 145,151 **** extendarray(&members, &grmembers, 200); members[0] = NULL; grp = &fakegroup; ! grp->gr_name = pw_checkname((u_char *)a_name->val, 0); grp->gr_passwd = "*"; grp->gr_gid = gr_gidpolicy(cnf, args); grp->gr_mem = members; --- 145,151 ---- extendarray(&members, &grmembers, 200); members[0] = NULL; grp = &fakegroup; ! grp->gr_name = pw_checkname((u_char *)a_name->val, PWC_DEFAULT); grp->gr_passwd = "*"; grp->gr_gid = gr_gidpolicy(cnf, args); grp->gr_mem = members; Index: pw_user.c =================================================================== RCS file: /cvs/src/usr.sbin/pw/pw_user.c,v retrieving revision 1.51 diff -c -r1.51 pw_user.c *** pw_user.c 24 Jun 2002 11:33:17 -0000 1.51 --- pw_user.c 27 Nov 2002 17:30:43 -0000 *************** *** 231,237 **** } } if ((arg = getarg(args, 'L')) != NULL) ! cnf->default_class = pw_checkname((u_char *)arg->val, 0); if ((arg = getarg(args, 'G')) != NULL && arg->val) { int i = 0; --- 231,237 ---- } } if ((arg = getarg(args, 'L')) != NULL) ! cnf->default_class = pw_checkname((u_char *)arg->val, PWC_DEFAULT); if ((arg = getarg(args, 'G')) != NULL && arg->val) { int i = 0; *************** *** 293,299 **** } if ((a_name = getarg(args, 'n')) != NULL) ! pwd = GETPWNAM(pw_checkname((u_char *)a_name->val, 0)); a_uid = getarg(args, 'u'); if (a_uid == NULL) { --- 293,299 ---- } if ((a_name = getarg(args, 'n')) != NULL) ! pwd = GETPWNAM(pw_checkname((u_char *)a_name->val, PWC_LOGIN)); a_uid = getarg(args, 'u'); if (a_uid == NULL) { *************** *** 455,461 **** if ((arg = getarg(args, 'l')) != NULL) { if (strcmp(pwd->pw_name, "root") == 0) errx(EX_DATAERR, "can't rename `root' account"); ! pwd->pw_name = pw_checkname((u_char *)arg->val, 0); edited = 1; } --- 455,461 ---- if ((arg = getarg(args, 'l')) != NULL) { if (strcmp(pwd->pw_name, "root") == 0) errx(EX_DATAERR, "can't rename `root' account"); ! pwd->pw_name = pw_checkname((u_char *)arg->val, PWC_LOGIN); edited = 1; } *************** *** 595,601 **** * Shared add/edit code */ if ((arg = getarg(args, 'c')) != NULL) { ! char *gecos = pw_checkname((u_char *)arg->val, 1); if (strcmp(pwd->pw_gecos, gecos) != 0) { pwd->pw_gecos = gecos; edited = 1; --- 595,601 ---- * Shared add/edit code */ if ((arg = getarg(args, 'c')) != NULL) { ! char *gecos = pw_checkname((u_char *)arg->val, PWC_GECOS); if (strcmp(pwd->pw_gecos, gecos) != 0) { pwd->pw_gecos = gecos; edited = 1; *************** *** 1192,1201 **** } char * ! pw_checkname(u_char *name, int gecos) { int l = 0; ! char const *notch = gecos ? ":!@" : " ,\t:+&#%$^()!@~*?<>=|\\/\""; while (name[l]) { if (strchr(notch, name[l]) != NULL || name[l] < ' ' || name[l] == 127 || --- 1192,1217 ---- } char * ! pw_checkname(u_char *name, enum _checktype checktype) { int l = 0; ! char const *notch; ! int gecos = (checktype == PWC_GECOS); ! ! switch (checktype) { ! case PWC_GECOS: ! notch = ":!@"; ! break; ! ! case PWC_LOGIN: ! notch = " ,\t:+&#%^()!@~*?<>=|\\/\""; ! break; ! ! case PWC_DEFAULT: ! default: ! notch = " ,\t:+&#%$^()!@~*?<>=|\\/\""; ! break; ! } while (name[l]) { if (strchr(notch, name[l]) != NULL || name[l] < ' ' || name[l] == 127 ||