getlogin_r: return early when linux sentinel value is set

Message ID CANSNSoW7FfRb1wp99O9PcKNJWxSnWVgVrgjORYDD62LBFVje_g@mail.gmail.com
State New, archived
Headers

Commit Message

Jesse Hathaway March 22, 2018, 1:49 p.m. UTC
  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;