public inbox for newlib@sourceware.org
 help / color / mirror / Atom feed
From: Jordi Sanfeliu <jordi@fibranet.cat>
To: newlib@sourceware.org
Subject: Re: [PATCH] Fix getlogin() to check only stdin to get a valid tty
Date: Thu, 13 Jul 2023 18:57:32 +0200	[thread overview]
Message-ID: <61101fc8-fc4f-8781-98a4-d84be32c126b@fibranet.cat> (raw)
In-Reply-To: <9ad091f5-4ca9-6410-e990-0cd4f1ece86e@foss.st.com>

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

  reply	other threads:[~2023-07-13 16:57 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-07-12 17:33 Jordi Sanfeliu
2023-07-12 18:50 ` Torbjorn SVENSSON
2023-07-12 20:06   ` Brian Inglis
2023-07-13 16:26     ` Torbjorn SVENSSON
2023-07-13  8:06   ` Jordi Sanfeliu
2023-07-13 16:25     ` Torbjorn SVENSSON
2023-07-13 16:57       ` Jordi Sanfeliu [this message]
2023-07-13 19:01         ` Jeff Johnston
2023-07-17  7:54           ` Corinna Vinschen
2023-07-13 21:12         ` Stefan Tauner
2023-07-17 19:06 ` Jeff Johnston
2023-07-18  5:57   ` Jordi Sanfeliu
2023-07-18  7:08   ` Jordi Sanfeliu
2023-07-18 17:44     ` Jeff Johnston
2023-07-18 18:59       ` Jordi Sanfeliu

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=61101fc8-fc4f-8781-98a4-d84be32c126b@fibranet.cat \
    --to=jordi@fibranet.cat \
    --cc=newlib@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).