[PATCH] Fix getlogin() to check only stdin to get a valid tty

Jeff Johnston jjohnstn@redhat.com
Mon Jul 17 19:06:23 GMT 2023


Original patch pushed, thanks.

-- Jeff J.

On Wed, Jul 12, 2023 at 1:34 PM Jordi Sanfeliu via Newlib <
newlib@sourceware.org> wrote:

> Hello,
>
> In my hobby OS [1] which uses Newlib C as its libc, I noticed that the
> GNU command 'logname' does output nothing when it is redirected or pipe'd.
>
> The current getlogin() implementation [2] forces the three primary file
> descriptors (stdin, stdout and stderr) to be a valid tty before checking
> the utmp file, otherwise it returns NULL. This makes impossible to
> redirect (to a file or to a pipe), the output of a program that is using
> this function because one of its file descriptors won't be a tty.
>
> See:
>
> # cat test.c
> #include <stdio.h>
>
> int main(void)
> {
>         char *user;
>
>         if(user = getlogin()) {
>                 printf("%s\n", user);
>         }
>
>         return 0;
> }
>
> # ./test
> root
> # ./test > xx
> # cat xx
> # ./test | cat
> #
>
> To fix this, I thought that only checking if stdin is a valid tty would
> be enough.
>
> Does this sound reasonable to you?
> Thanks.
>
>
>
> diff --git a/newlib/libc/unix/getlogin.c b/newlib/libc/unix/getlogin.c
> index da4f47a95..e646bcb08 100644
> --- a/newlib/libc/unix/getlogin.c
> +++ b/newlib/libc/unix/getlogin.c
> @@ -16,9 +16,7 @@ getlogin ()
>     extern char *ttyname ();
>     char *tty;
>
> -  if (((tty = ttyname (0)) == 0)
> -      || ((tty = ttyname (1)) == 0)
> -      || ((tty = ttyname (2)) == 0))
> +  if ((tty = ttyname (0)) == 0)
>       return 0;
>
>     if ((utmp_fd = open (UTMP_FILE, O_RDONLY)) == -1)
>
>
> 1. https://www.fiwix.org
> 2.
>
> https://sourceware.org/git/?p=newlib-cygwin.git;a=blob_plain;f=newlib/libc/unix/getlogin.c;hb=HEAD
>
> --
> Jordi Sanfeliu
> FIBRANET Network Services Provider
> https://www.fibranet.cat
>
>


More information about the Newlib mailing list