Prompted by tedu@'s recent reply, here's a fix for getent(1) to lookup
keys as UIDs only if the username lookup fails to prevent clobbering
numerical usernames.

        $ getent passwd 1000 kn
        kn:*:1000:1000:Klemens Nanni:/home/kn:/bin/ksh
        kn:*:1000:1000:Klemens Nanni:/home/kn:/bin/ksh

        $ ./obj/getent passwd 1000 kn
        1000:*:1003:1003::/home/1000:/bin/ksh
        kn:*:1000:1000:Klemens Nanni:/home/kn:/bin/ksh

OK?

Index: getent.c
===================================================================
RCS file: /cvs/src/usr.bin/getent/getent.c,v
retrieving revision 1.20
diff -u -p -r1.20 getent.c
--- getent.c    26 Sep 2018 16:39:19 -0000      1.20
+++ getent.c    1 Nov 2018 21:51:01 -0000
@@ -302,11 +302,11 @@ passwd(int argc, char *argv[])
                        PASSWDPRINT;
        } else {
                for (i = 2; i < argc; i++) {
-                       uid = strtonum(argv[i], 0, UID_MAX, &err);
-                       if (!err)
-                               pw = getpwuid(uid);
-                       else
-                               pw = getpwnam(argv[i]);
+                       if ((pw = getpwnam(argv[i])) == NULL) {
+                               uid = strtonum(argv[i], 0, UID_MAX, &err);
+                               if (err == NULL)
+                                       pw = getpwuid(uid);
+                       }
                        if (pw != NULL)
                                PASSWDPRINT;
                        else {

Reply via email to