Patchwork getlogin_r: return early when linux sentinel value is set

login
register
mail settings
Submitter Jesse Hathaway
Date March 22, 2018, 1:49 p.m.
Message ID <CANSNSoW7FfRb1wp99O9PcKNJWxSnWVgVrgjORYDD62LBFVje_g@mail.gmail.com>
Download mbox | patch
Permalink /patch/26430/
State New
Headers show

Comments

Jesse Hathaway - March 22, 2018, 1:49 p.m.
On Thu, Mar 22, 2018 at 1:14 AM, Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:

> LGTM with CL bit fixed below.  Do you need someone to push it for you?

Thanks for the review, if you could push it that would be great, updated
patch attached which fixes the changelog entry

Patch

commit 2fe96a5e58bb1b4ab379d1e7a85925bd83755cf7
Author: Jesse Hathaway <jesse@mbuki-mvuki.org>
Date:   Fri Mar 16 10:46:50 2018 -0500

    getlogin_r: return early when linux sentinel value is set
    
    When there is no login uid Linux sets /proc/self/loginid to the sentinel
    value of, (uid_t) - 1. If this is set we can return early and avoid
    needlessly looking up the sentinel value in any configured nss
    databases.

diff --git a/ChangeLog b/ChangeLog
index 3399e567b8..5d776d995f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@ 
+2018-03-20  Jesse Hathaway  <jesse@mbuki-mvuki.org>  (tiny change)
+
+	* sysdeps/unix/sysv/linux/getlogin_r.c (__getlogin_r_loginuid): Return
+	early when linux sentinel value is set.
+
 2018-03-20  Samuel Thibault  <samuel.thibault@ens-lyon.org>
 
 	* manual/errno.texi (EOWNERDEAD, ENOTRECOVERABLE): Remove errno
diff --git a/sysdeps/unix/sysv/linux/getlogin_r.c b/sysdeps/unix/sysv/linux/getlogin_r.c
index 73ea14c8f9..1f90c1ca2d 100644
--- a/sysdeps/unix/sysv/linux/getlogin_r.c
+++ b/sysdeps/unix/sysv/linux/getlogin_r.c
@@ -55,6 +55,15 @@  __getlogin_r_loginuid (char *name, size_t namesize)
 	  endp == uidbuf || *endp != '\0'))
     return -1;
 
+  /* If there is no login uid, linux sets /proc/self/loginid to the sentinel
+     value of, (uid_t) - 1, so check if that value is set and return early to
+     avoid making unneeded nss lookups. */
+  if (uid == (uid_t) - 1)
+    {
+      __set_errno (ENXIO);
+      return ENXIO;
+    }
+
   struct passwd pwd;
   struct passwd *tpwd;
   int result = 0;