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

Jeff Johnston <[email protected]>
Newsgroups gmane.comp.lib.newlib
Message-ID <CAOox84v-AQC94i7=nRVBrWUTobOLTChgbiq14kjM-Td3Mgqe+g@mail.gmail.com>
Original patch pushed, thanks.

-- Jeff J.

On Wed, Jul 12, 2023 at 1:34 PM Jordi Sanfeliu via Newlib <
[email protected]> 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
>
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.