Author: bapt
Date: Wed Dec  9 21:34:03 2015
New Revision: 292025
URL: https://svnweb.freebsd.org/changeset/base/292025

Log:
  MFC: r291657
  
  Fix handling of numeric-only names with pw lock
  Add a regression test about it
  
  PR:           204968

Modified:
  stable/10/usr.sbin/pw/pw_user.c
  stable/10/usr.sbin/pw/tests/pw_lock.sh
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/usr.sbin/pw/pw_user.c
==============================================================================
--- stable/10/usr.sbin/pw/pw_user.c     Wed Dec  9 19:25:45 2015        
(r292024)
+++ stable/10/usr.sbin/pw/pw_user.c     Wed Dec  9 21:34:03 2015        
(r292025)
@@ -272,7 +272,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,16 +280,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);
-               name = NULL;
-       } else
-               name = arg1;
-
-       pwd = (name != NULL) ? GETPWNAM(pw_checkname(name, 0)) : GETPWUID(id);
+       name = arg1;
+       if (arg1[strspn(name, "0123456789")] == '\0')
+               id = pw_checkid(name, UID_MAX);
+
+       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);
        }
 

Modified: stable/10/usr.sbin/pw/tests/pw_lock.sh
==============================================================================
--- stable/10/usr.sbin/pw/tests/pw_lock.sh      Wed Dec  9 19:25:45 2015        
(r292024)
+++ stable/10/usr.sbin/pw/tests/pw_lock.sh      Wed Dec  9 21:34:03 2015        
(r292025)
@@ -16,7 +16,27 @@ user_locking_body() {
                grep "^test:\*:1001:" $HOME/master.passwd
 }
 
+atf_test_case numeric_locking cleanup
+numeric_locking_body() {
+       populate_etc_skel
+       ${PW} useradd test || atf_fail "Creating test user"
+       ${PW} lock 1001 || atf_fail "Locking the user"
+       atf_check -s exit:0 -o match:"^test:\*LOCKED\*\*:1001:" \
+               grep "^test:\*LOCKED\*\*:1001:" $HOME/master.passwd
+       ${PW} unlock 1001 || atf_fail "Unlocking the user"
+       atf_check -s exit:0 -o match:"^test:\*:1001:" \
+               grep "^test:\*:1001:" $HOME/master.passwd
+       # Now numeric names
+       ${PW} useradd -n 1001 || atf_fail "Creating test user"
+       ${PW} lock 1001 || atf_fail "Locking the user"
+       atf_check -s exit:0 -o match:"^1001:\*LOCKED\*\*:1002:" \
+               grep "^1001:\*LOCKED\*\*:1002:" $HOME/master.passwd
+       ${PW} unlock 1001 || atf_fail "Unlocking the user"
+       atf_check -s exit:0 -o match:"^1001:\*:1002:" \
+               grep "^1001:\*:1002:" $HOME/master.passwd
+}
 
 atf_init_test_cases() {
        atf_add_test_case user_locking
+       atf_add_test_case numeric_locking
 }
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-stable-10
To unsubscribe, send any mail to "[email protected]"

Reply via email to