diff mbox series

getlogin_r: return early when linux sentinel value is set

Message ID CANSNSoWLXfsYq6kP0niyP8r25S=S1uTKN=+46xnC_SPLBmKXhQ@mail.gmail.com
State New
Headers show
Series getlogin_r: return early when linux sentinel value is set | expand

Commit Message

Jesse Hathaway March 16, 2018, 4:18 p.m. UTC
When there is no login uid Linux sets /proc/self/loginid to the sentinel
value of 4294967295. If this is set we can return early and avoid
needlessly looking up the sentinel value in any configured nss
databases.

Comments

Jesse Hathaway March 19, 2018, 3:03 p.m. UTC | #1
This is my first time submitting a patch, so any feedback would be
very much appreciated.

On Fri, Mar 16, 2018 at 11:18 AM, Jesse Hathaway <jesse@mbuki-mvuki.org> wrote:
> When there is no login uid Linux sets /proc/self/loginid to the sentinel
> value of 4294967295. If this is set we can return early and avoid
> needlessly looking up the sentinel value in any configured nss
> databases.
>
> diff --git a/sysdeps/unix/sysv/linux/getlogin_r.c
> b/sysdeps/unix/sysv/linux/getlogin_r.c
> index 73ea14c8f9..43f55a2188 100644
> --- a/sysdeps/unix/sysv/linux/getlogin_r.c
> +++ b/sysdeps/unix/sysv/linux/getlogin_r.c
> @@ -55,6 +55,12 @@ __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 4294967295, so check if the value is set and return early to
> +     avoid making unneeded nss lookups. */
> +  if (uid == 4294967295)
> +    return ENXIO;
> +
>    struct passwd pwd;
>    struct passwd *tpwd;
>    int result = 0;
Adhemerval Zanella Netto March 20, 2018, 8 a.m. UTC | #2
On 17/03/2018 00:18, Jesse Hathaway wrote:
> When there is no login uid Linux sets /proc/self/loginid to the sentinel
> value of 4294967295. If this is set we can return early and avoid
> needlessly looking up the sentinel value in any configured nss
> databases.

The change is short enough so I think it won't require a copyright
assignment.  However it does require a ChangeLog entry, could you please
resend the patch with a proper one?

> 
> diff --git a/sysdeps/unix/sysv/linux/getlogin_r.c
> b/sysdeps/unix/sysv/linux/getlogin_r.c
> index 73ea14c8f9..43f55a2188 100644
> --- a/sysdeps/unix/sysv/linux/getlogin_r.c
> +++ b/sysdeps/unix/sysv/linux/getlogin_r.c
> @@ -55,6 +55,12 @@ __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 4294967295, so check if the value is set and return early to
> +     avoid making unneeded nss lookups. */
> +  if (uid == 4294967295)
> +    return ENXIO;

I prefer to just use either (int)-1 or just 0xffffffff.  Also,
__getlogin_r_loginuid should set errno itself as for ERANGE instead
of just return its value (errno won't be set in this case and I think
it got it wrong for ENOMEM in this case).

> +
>    struct passwd pwd;
>    struct passwd *tpwd;
>    int result = 0;
>
Andreas Schwab March 20, 2018, 9:05 a.m. UTC | #3
On Mär 20 2018, Adhemerval Zanella <adhemerval.zanella@linaro.org> wrote:

> On 17/03/2018 00:18, Jesse Hathaway wrote:
>> When there is no login uid Linux sets /proc/self/loginid to the sentinel
>> value of 4294967295. If this is set we can return early and avoid
>> needlessly looking up the sentinel value in any configured nss
>> databases.
>
> The change is short enough so I think it won't require a copyright
> assignment.  However it does require a ChangeLog entry, could you please
> resend the patch with a proper one?
>
>> 
>> diff --git a/sysdeps/unix/sysv/linux/getlogin_r.c
>> b/sysdeps/unix/sysv/linux/getlogin_r.c
>> index 73ea14c8f9..43f55a2188 100644
>> --- a/sysdeps/unix/sysv/linux/getlogin_r.c
>> +++ b/sysdeps/unix/sysv/linux/getlogin_r.c
>> @@ -55,6 +55,12 @@ __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 4294967295, so check if the value is set and return early to
>> +     avoid making unneeded nss lookups. */
>> +  if (uid == 4294967295)
>> +    return ENXIO;
>
> I prefer to just use either (int)-1 or just 0xffffffff.

That should be (uid_t) -1.

Andreas.
Jesse Hathaway March 20, 2018, 5:52 p.m. UTC | #4
Thanks for the review Adhemerval:

On Tue, Mar 20, 2018 at 3:00 AM, Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
> The change is short enough so I think it won't require a copyright
> assignment.  However it does require a ChangeLog entry, could you please
> resend the patch with a proper one?

added

> > diff --git a/sysdeps/unix/sysv/linux/getlogin_r.c
> > b/sysdeps/unix/sysv/linux/getlogin_r.c
> > index 73ea14c8f9..43f55a2188 100644
> > --- a/sysdeps/unix/sysv/linux/getlogin_r.c
> > +++ b/sysdeps/unix/sysv/linux/getlogin_r.c
> > @@ -55,6 +55,12 @@ __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 4294967295, so check if the value is set and return early to
> > +     avoid making unneeded nss lookups. */
> > +  if (uid == 4294967295)
> > +    return ENXIO;
>
> I prefer to just use either (int)-1 or just 0xffffffff.

changed to (uid_t) - 1

> Also,
> __getlogin_r_loginuid should set errno itself as for ERANGE instead
> of just return its value (errno won't be set in this case and I think
> it got it wrong for ENOMEM in this case).

Would you be so kind as to explain this a little more to someone with
very little C experience. I returned the errno value because the
comment on the function indicates that is what the caller expects:

/* Try to determine login name from /proc/self/loginuid and return 0
   if successful.  If /proc/self/loginuid cannot be read return -1.
   Otherwise return the error number.  */

and getlogin when it calls __getlogin_r_loginuid, only checks the
return value, and not the errno value

Thanks, Jesse

Updated patch:

From 7ddef30f32b30cd7579ff4b0ea666862022aa0ec Mon Sep 17 00:00:00 2001
From: Jesse Hathaway <jesse@mbuki-mvuki.org>
Date: Fri, 16 Mar 2018 10:46:50 -0500
Subject: [PATCH] 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..1ceff1c094 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..8f0e997d43 100644
--- a/sysdeps/unix/sysv/linux/getlogin_r.c
+++ b/sysdeps/unix/sysv/linux/getlogin_r.c
@@ -55,6 +55,12 @@ __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)
+    return ENXIO;
+
   struct passwd pwd;
   struct passwd *tpwd;
   int result = 0;
Andreas Schwab March 20, 2018, 6:30 p.m. UTC | #5
On Mär 20 2018, Jesse Hathaway <jesse@mbuki-mvuki.org> wrote:

>> Also,
>> __getlogin_r_loginuid should set errno itself as for ERANGE instead
>> of just return its value (errno won't be set in this case and I think
>> it got it wrong for ENOMEM in this case).
>
> Would you be so kind as to explain this a little more to someone with
> very little C experience. I returned the errno value because the
> comment on the function indicates that is what the caller expects:
>
> /* Try to determine login name from /proc/self/loginuid and return 0
>    if successful.  If /proc/self/loginuid cannot be read return -1.
>    Otherwise return the error number.  */
>
> and getlogin when it calls __getlogin_r_loginuid, only checks the
> return value, and not the errno value

Depends on whether you want the linux __getlogin_r to fall back to the
generic __getlogin_r.

Andreas.
Jesse Hathaway March 21, 2018, 9:27 p.m. UTC | #6
On Tue, Mar 20, 2018 at 1:30 PM, Andreas Schwab <schwab@linux-m68k.org> wrote:
> Depends on whether you want the linux __getlogin_r to fall back to the
> generic __getlogin_r.

Thanks, updated patch below:

From 04a50b5ee857aa33e1527d70f0676b6daf5a036c Mon Sep 17 00:00:00 2001
From: Jesse Hathaway <jesse@mbuki-mvuki.org>
Date: Fri, 16 Mar 2018 10:46:50 -0500
Subject: [PATCH] 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..1ceff1c094 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;
Adhemerval Zanella Netto March 22, 2018, 6:14 a.m. UTC | #7
On 22/03/2018 05:27, Jesse Hathaway wrote:
> On Tue, Mar 20, 2018 at 1:30 PM, Andreas Schwab <schwab@linux-m68k.org> wrote:
>> Depends on whether you want the linux __getlogin_r to fall back to the
>> generic __getlogin_r.
> 
> Thanks, updated patch below:
> 
> From 04a50b5ee857aa33e1527d70f0676b6daf5a036c Mon Sep 17 00:00:00 2001
> From: Jesse Hathaway <jesse@mbuki-mvuki.org>
> Date: Fri, 16 Mar 2018 10:46:50 -0500
> Subject: [PATCH] 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.

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

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>

> 
> diff --git a/ChangeLog b/ChangeLog
> index 3399e567b8..1ceff1c094 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.

It should contain a tab first and respect the maximum line size of 78, as:

        * 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;
>
Jesse Hathaway March 22, 2018, 1:49 p.m. UTC | #8
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
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;
Andreas Schwab March 22, 2018, 5:35 p.m. UTC | #9
On Mär 21 2018, Jesse Hathaway <jesse@mbuki-mvuki.org> wrote:

> +  /* 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)

No space after unary operator.

Andreas.
Jesse Hathaway March 22, 2018, 7:30 p.m. UTC | #10
On Thu, Mar 22, 2018 at 12:35 PM, Andreas Schwab <schwab@linux-m68k.org> wrote:
> On Mär 21 2018, Jesse Hathaway <jesse@mbuki-mvuki.org> wrote:
>> +  if (uid == (uid_t) - 1)

fixed, attached
commit 7d60c6ab90d23bab16adc2809de95f99e84862d5
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..14587712a7 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;
Jesse Hathaway March 26, 2018, 2:22 p.m. UTC | #11
On Thu, Mar 22, 2018 at 2:30 PM, Jesse Hathaway <jesse@mbuki-mvuki.org> wrote:
> fixed, attached

Adhemerval Zanella would you be able to push this for me?
commit 7d60c6ab90d23bab16adc2809de95f99e84862d5
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..14587712a7 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;
Adhemerval Zanella Netto March 26, 2018, 4:30 p.m. UTC | #12
I will take care of it today, thanks for remind me.

Sent from my iPhone

> On 26 Mar 2018, at 11:22, Jesse Hathaway <jesse@mbuki-mvuki.org> wrote:
> 
>> On Thu, Mar 22, 2018 at 2:30 PM, Jesse Hathaway <jesse@mbuki-mvuki.org> wrote:
>> fixed, attached
> 
> Adhemerval Zanella would you be able to push this for me?
> <getlogin_r.c.patch>
Adhemerval Zanella Netto March 28, 2018, 12:37 a.m. UTC | #13
Pushed upstream.

On 26/03/2018 13:30, Adhemerval Zanella wrote:
> I will take care of it today, thanks for remind me.
> 
> Sent from my iPhone
> 
>> On 26 Mar 2018, at 11:22, Jesse Hathaway <jesse@mbuki-mvuki.org> wrote:
>>
>>> On Thu, Mar 22, 2018 at 2:30 PM, Jesse Hathaway <jesse@mbuki-mvuki.org> wrote:
>>> fixed, attached
>>
>> Adhemerval Zanella would you be able to push this for me?
>> <getlogin_r.c.patch>
Florian Weimer April 3, 2018, 10:46 a.m. UTC | #14
On 03/28/2018 02:37 AM, Adhemerval Zanella wrote:
> Pushed upstream.
> 
> On 26/03/2018 13:30, Adhemerval Zanella wrote:
>> I will take care of it today, thanks for remind me.
>>
>> Sent from my iPhone
>>
>>> On 26 Mar 2018, at 11:22, Jesse Hathaway <jesse@mbuki-mvuki.org> wrote:
>>>
>>>> On Thu, Mar 22, 2018 at 2:30 PM, Jesse Hathaway <jesse@mbuki-mvuki.org> wrote:
>>>> fixed, attached
>>>
>>> Adhemerval Zanella would you be able to push this for me?
>>> <getlogin_r.c.patch>

If this has user-visible impact, it should have a bug in Bugzilla, 
referenced from the ChangeLog entry.

Thanks,
Florian
Adhemerval Zanella Netto April 3, 2018, 11:40 a.m. UTC | #15
On 03/04/2018 07:46, Florian Weimer wrote:
> On 03/28/2018 02:37 AM, Adhemerval Zanella wrote:
>> Pushed upstream.
>>
>> On 26/03/2018 13:30, Adhemerval Zanella wrote:
>>> I will take care of it today, thanks for remind me.
>>>
>>> Sent from my iPhone
>>>
>>>> On 26 Mar 2018, at 11:22, Jesse Hathaway <jesse@mbuki-mvuki.org> wrote:
>>>>
>>>>> On Thu, Mar 22, 2018 at 2:30 PM, Jesse Hathaway <jesse@mbuki-mvuki.org> wrote:
>>>>> fixed, attached
>>>>
>>>> Adhemerval Zanella would you be able to push this for me?
>>>> <getlogin_r.c.patch>
> 
> If this has user-visible impact, it should have a bug in Bugzilla, referenced from the ChangeLog entry.
>

My understanding it is optimization to avoid access nss in
case of invalid uid.
Florian Weimer April 3, 2018, 11:44 a.m. UTC | #16
On 04/03/2018 01:40 PM, Adhemerval Zanella wrote:
> 
> 
> On 03/04/2018 07:46, Florian Weimer wrote:
>> On 03/28/2018 02:37 AM, Adhemerval Zanella wrote:
>>> Pushed upstream.
>>>
>>> On 26/03/2018 13:30, Adhemerval Zanella wrote:
>>>> I will take care of it today, thanks for remind me.
>>>>
>>>> Sent from my iPhone
>>>>
>>>>> On 26 Mar 2018, at 11:22, Jesse Hathaway <jesse@mbuki-mvuki.org> wrote:
>>>>>
>>>>>> On Thu, Mar 22, 2018 at 2:30 PM, Jesse Hathaway <jesse@mbuki-mvuki.org> wrote:
>>>>>> fixed, attached
>>>>>
>>>>> Adhemerval Zanella would you be able to push this for me?
>>>>> <getlogin_r.c.patch>
>>
>> If this has user-visible impact, it should have a bug in Bugzilla, referenced from the ChangeLog entry.

> My understanding it is optimization to avoid access nss in
> case of invalid uid.

There's a Launchpad bug that suggests a very visible difference in behavior:

https://bugs.launchpad.net/ubuntu/+source/glibc/+bug/1760713

Thanks,
Florian
Adhemerval Zanella Netto April 3, 2018, 11:53 a.m. UTC | #17
On 03/04/2018 08:44, Florian Weimer wrote:
> On 04/03/2018 01:40 PM, Adhemerval Zanella wrote:
>>
>>
>> On 03/04/2018 07:46, Florian Weimer wrote:
>>> On 03/28/2018 02:37 AM, Adhemerval Zanella wrote:
>>>> Pushed upstream.
>>>>
>>>> On 26/03/2018 13:30, Adhemerval Zanella wrote:
>>>>> I will take care of it today, thanks for remind me.
>>>>>
>>>>> Sent from my iPhone
>>>>>
>>>>>> On 26 Mar 2018, at 11:22, Jesse Hathaway <jesse@mbuki-mvuki.org> wrote:
>>>>>>
>>>>>>> On Thu, Mar 22, 2018 at 2:30 PM, Jesse Hathaway <jesse@mbuki-mvuki.org> wrote:
>>>>>>> fixed, attached
>>>>>>
>>>>>> Adhemerval Zanella would you be able to push this for me?
>>>>>> <getlogin_r.c.patch>
>>>
>>> If this has user-visible impact, it should have a bug in Bugzilla, referenced from the ChangeLog entry.
> 
>> My understanding it is optimization to avoid access nss in
>> case of invalid uid.
> 
> There's a Launchpad bug that suggests a very visible difference in behavior:
> 
> https://bugs.launchpad.net/ubuntu/+source/glibc/+bug/1760713
> 
> Thanks,
> Florian

Alright, https://sourceware.org/bugzilla/show_bug.cgi?id=23024
diff mbox series

Patch

diff --git a/sysdeps/unix/sysv/linux/getlogin_r.c
b/sysdeps/unix/sysv/linux/getlogin_r.c
index 73ea14c8f9..43f55a2188 100644
--- a/sysdeps/unix/sysv/linux/getlogin_r.c
+++ b/sysdeps/unix/sysv/linux/getlogin_r.c
@@ -55,6 +55,12 @@  __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 4294967295, so check if the value is set and return early to
+     avoid making unneeded nss lookups. */
+  if (uid == 4294967295)
+    return ENXIO;
+
   struct passwd pwd;
   struct passwd *tpwd;
   int result = 0;