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

Jordi Sanfeliu via Newlib <[email protected]>
Newsgroups gmane.comp.lib.newlib
Message-ID <[email protected]>
Hello,

So we have two possible patches to solve this situation:

My first original patch that only checks if stdin is a tty and seems to 
match with glibc comments provided by Torbjörn. The only problem is that 
it won't work in the scenario when someone pipes some data on stdin to 
the application:

$ echo | ./test
$


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)



And a patch based on the comments of Torbjörn that checks all three fds 
before returning NULL:

diff --git a/newlib/libc/unix/getlogin.c b/newlib/libc/unix/getlogin.c
index da4f47a95..5a3f172e7 100644
--- a/newlib/libc/unix/getlogin.c
+++ b/newlib/libc/unix/getlogin.c
@@ -16,10 +16,10 @@ getlogin ()
    extern char *ttyname ();
    char *tty;

-  if (((tty = ttyname (0)) == 0)
-      || ((tty = ttyname (1)) == 0)
-      || ((tty = ttyname (2)) == 0))
-    return 0;
+  if ((tty = ttyname (0)) == 0)
+      if ((tty = ttyname (1)) == 0)
+          if ((tty = ttyname (2)) == 0)
+              return 0;

    if ((utmp_fd = open (UTMP_FILE, O_RDONLY)) == -1)
      return 0;


Any thoughts?
Thanks.


On 7/13/23 18:25, Torbjorn SVENSSON wrote:

> I took a sneak peak at how glibc does this and there is this comment:
> 
>    /* Get name of tty connected to fd 0.  Return NULL if not a tty or
>       if fd 0 isn't open.  Note that a lot of documentation says that
>       getlogin() is based on the controlling terminal---what they
>       really mean is "the terminal connected to standard input".  The
>       getlogin() implementation of DEC Unix, SunOS, Solaris, HP-UX all
>       return NULL if fd 0 has been closed, so this is the compatible
>       thing to do.  Note that ttyname(open("/dev/tty")) on those
>       systems returns /dev/tty, so that is not a possible solution for
>       getlogin().  */
> 
> Based on this comment, I guess it would be sane to drop the check on 
> stdout and stderr, but it would have the consequence that you are not 
> able to pipe some data on stdin to the application that calls getlogin 
> as it would fail in that scenario.
> 
> I'm not a maintainer of newlib so I don't really have anything to say 
> about what path you decide to go.

-- 
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.