public inbox for cygwin-developers@cygwin.com
 help / color / mirror / Atom feed
From: Corinna Vinschen <corinna-cygwin@cygwin.com>
To: cygwin-developers@cygwin.com
Subject: Re: fstat and similar methods in fhandler_socket_local and fhandler_socket_unix
Date: Mon, 22 Feb 2021 10:44:25 +0100	[thread overview]
Message-ID: <YDN8+SJdO73ywHjr@calimero.vinschen.de> (raw)
In-Reply-To: <508b12a5-9797-9236-a5b5-d8ff5968ad5d@cornell.edu>

On Feb 21 13:04, Ken Brown via Cygwin-developers wrote:
> On 2/20/2021 6:51 PM, Ken Brown via Cygwin-developers wrote:
> > On 2/20/2021 6:32 PM, Ken Brown via Cygwin-developers wrote:
> > > fhandler_socket_local::fstat and many similar methods seem to assume
> > > that the fhandler is based on a socket *file*.  When this is not the
> > > case, they end up using handles inappropriately.  Consider the
> > > following test case, for example.
> > > 
> > > $ cat socket_stat.c
> > > [...]
> > > I haven't been able to find any documentation about what fstat(2)
> > > should do on a socket descriptor, so maybe the difference between
> > > Cygwin and Linux is unimportant.  But the code path followed on
> > > Cygwin definitely seems wrong. fhandler_socket_local::fstat calls
> > > fstat_fs which ends up using the io_handle as though it were a file
> > > handle.

I see what you mean.  This was clearly fat-fingered, probably after
trying to add abstract sockets.

> It seems to me that fstat_fs should only be called if we
> > > have a path_conv handle (which is the case if the fstat call
> > > resulted from a stat call) or if the socket descriptor came from
> > > open with O_PATH set.
> > > 
> > > Similar remarks apply to fstatfvs, fchmod,....  In some of these
> > > cases, like fchmod, POSIX explicitly states that the behavior is
> > > undefined, so maybe we should just fail when there's no underlying
> > > socket file.
> > 
> > Maybe the answer in all these cases is just to revert to the
> > fhandler_socket methods when our fhandler_socket_local is not based on a
> > socket file.
> 
> I think the following should do the job for fstat:
> 
> --- a/winsup/cygwin/fhandler_socket_local.cc
> +++ b/winsup/cygwin/fhandler_socket_local.cc
> @@ -673,11 +673,11 @@ fhandler_socket_local::fcntl (int cmd, intptr_t arg)
>  int __reg2
>  fhandler_socket_local::fstat (struct stat *buf)
>  {
> -  int res;
> +  if (!pc.handle () && !(get_flags () & O_PATH))
> +    /* fstat is not being called on a socket file. */

The comment should probably read "fstat called on a socket"...

> +    return fhandler_socket::fstat (buf);

...plus adding a comment right here:

     /* stat/lstat on a socket file or fstat on a socket opened w/ O_PATH */

> -  if (get_sun_path () && get_sun_path ()[0] == '\0')
> -    return fhandler_socket_wsock::fstat (buf);
> -  res = fhandler_base::fstat_fs (buf);
> +  int res = fhandler_base::fstat_fs (buf);
>    if (!res)
>      {
>        buf->st_mode = (buf->st_mode & ~S_IFMT) | S_IFSOCK;
> 
> With this patch, the output of my testcase looks like this:
> 
> File type:                socket
> I-node number:            6
> dev:                      1966080
> rdev:                     1966200
> Mode:                     140777 (octal)
> Link count:               1
> Ownership:                UID=197609   GID=197121
> Preferred I/O block size: 65536 bytes
> File size:                0 bytes
> Blocks allocated:         0
> Last status change:       Thu Nov 30 19:00:00 2006
> Last file access:         Sun Feb 21 13:03:03 2021
> Last file modification:   Sun Feb 21 13:03:03 2021

Might be a good idea to check the output twice in your testcase, adding
a second fstat call after calling bind, to see if it's still the same
after binding the socket to a file.

> If this patch looks right, I'll look at the other system calls too.

Yeah, I think you're right.  Thanks!


Corinna

  reply	other threads:[~2021-02-22  9:44 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-20 23:32 Ken Brown
2021-02-20 23:51 ` Ken Brown
2021-02-21 18:04   ` Ken Brown
2021-02-22  9:44     ` Corinna Vinschen [this message]
2021-02-22 20:01       ` Ken Brown
2021-02-24  9:06         ` Corinna Vinschen
2021-02-24 15:32           ` Ken Brown
2021-02-24 17:06             ` Corinna Vinschen
2021-02-24 17:27               ` Ken Brown
2021-02-25 13:18                 ` Ken Brown
2021-02-25 17:03                   ` Corinna Vinschen

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=YDN8+SJdO73ywHjr@calimero.vinschen.de \
    --to=corinna-cygwin@cygwin.com \
    --cc=cygwin-developers@cygwin.com \
    /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).