Florian Weimer <fweimer@redhat.com> writes:
> Most importantly, if getwpuid_r fails, it does not make sense to retry
> via utmp because the user ID obtained from there is less reliable than
> the one from /proc/self/loginuid.
Reviewed-by: Sam James <sam@gentoo.org>
> ---
> sysdeps/unix/sysv/linux/getlogin_r.c | 21 +++++++++++++++++----
> 1 file changed, 17 insertions(+), 4 deletions(-)
>
> diff --git a/sysdeps/unix/sysv/linux/getlogin_r.c b/sysdeps/unix/sysv/linux/getlogin_r.c
> index 3b85e91be6..200c96860f 100644
> --- a/sysdeps/unix/sysv/linux/getlogin_r.c
> +++ b/sysdeps/unix/sysv/linux/getlogin_r.c
> @@ -37,7 +37,12 @@ __getlogin_r_loginuid (char *name, size_t namesize)
> {
> int fd = __open_nocancel ("/proc/self/loginuid", O_RDONLY);
> if (fd == -1)
> - return -1;
> + {
> + if (errno == ENOENT)
> + /* Trigger utmp fallback. */
> + return -1;
> + return errno;
> + }
>
> /* We are reading a 32-bit number. 12 bytes are enough for the text
> representation. If not, something is wrong. */
> @@ -45,6 +50,8 @@ __getlogin_r_loginuid (char *name, size_t namesize)
> ssize_t n = TEMP_FAILURE_RETRY (__read_nocancel (fd, uidbuf,
> sizeof (uidbuf)));
> __close_nocancel_nostatus (fd);
> + if (n < 0)
> + return errno;
>
> uid_t uid;
> char *endp;
> @@ -53,12 +60,13 @@ __getlogin_r_loginuid (char *name, size_t namesize)
> || (uidbuf[n] = '\0',
> uid = strtoul (uidbuf, &endp, 10),
> endp == uidbuf || *endp != '\0'))
> - return -1;
> + return EINVAL;
>
> /* 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)
> + /* Trigger utmp fallback. */
> return -1;
>
> struct passwd pwd;
> @@ -78,9 +86,14 @@ __getlogin_r_loginuid (char *name, size_t namesize)
> }
> }
>
> - if (res != 0 || tpwd == NULL)
> + if (res != 0)
> + {
> + result = res;
> + goto out;
> + }
> + if (tpwd == NULL)
> {
> - result = -1;
> + result = ENOENT;
> goto out;
> }
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 418 bytes
Desc: not available
URL: <https://sourceware.org/pipermail/libc-alpha/attachments/20260209/371b0f8f/attachment-0001.sig>