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

Reply via email to