Cygwin: fix fstat on sockets that are not socket files

If fstat(2) is called on an AF_LOCAL or AF_UNIX socket that is not a
socket file, the current code calls fstat_fs.  The latter expects to
be operating on a disk file and uses the socket's io_handle, which is
not a file handle.

Fix this by calling fstat_fs only if the fhandler_socket object is a
file (determined by testing dev().isfs()).
This commit is contained in:
Ken Brown 2021-02-22 09:08:04 -05:00
parent 26478769a6
commit 2f24c0b993
2 changed files with 10 additions and 10 deletions

View File

@ -673,11 +673,12 @@ fhandler_socket_local::fcntl (int cmd, intptr_t arg)
int __reg2
fhandler_socket_local::fstat (struct stat *buf)
{
int res;
if (get_sun_path () && get_sun_path ()[0] == '\0')
if (!dev ().isfs ())
/* fstat called on a socket. */
return fhandler_socket_wsock::fstat (buf);
res = fhandler_base::fstat_fs (buf);
/* stat/lstat on a socket file or fstat on a socket opened w/ O_PATH. */
int res = fhandler_base::fstat_fs (buf);
if (!res)
{
buf->st_mode = (buf->st_mode & ~S_IFMT) | S_IFSOCK;

View File

@ -2337,13 +2337,12 @@ fhandler_socket_unix::fcntl (int cmd, intptr_t arg)
int __reg2
fhandler_socket_unix::fstat (struct stat *buf)
{
int ret = 0;
if (sun_path ()
&& (sun_path ()->un_len <= (socklen_t) sizeof (sa_family_t)
|| sun_path ()->un.sun_path[0] == '\0'))
if (!dev ().isfs ())
/* fstat called on a socket. */
return fhandler_socket::fstat (buf);
ret = fhandler_base::fstat_fs (buf);
/* stat/lstat on a socket file or fstat on a socket opened w/ O_PATH. */
int ret = fhandler_base::fstat_fs (buf);
if (!ret)
{
buf->st_mode = (buf->st_mode & ~S_IFMT) | S_IFSOCK;