[newlib-cygwin] Cygwin: AF_LOCAL: fix fcntl and dup if O_PATH is set

Ken Brown kbrown@sourceware.org
Thu Jan 30 14:44:00 GMT 2020


https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=477121317d01b37d0f6c84f7724487ecf8a9fbbe

commit 477121317d01b37d0f6c84f7724487ecf8a9fbbe
Author: Ken Brown <kbrown@cornell.edu>
Date:   Sat Jan 25 13:08:00 2020 -0500

    Cygwin: AF_LOCAL: fix fcntl and dup if O_PATH is set
    
    Make fhandler_socket_local::dup and fhandler_socket_local::fcntl (a
    new method) call fhandler_base::dup and fhandler_base::fcntl if O_PATH
    is set.
    
    We're viewing the socket as a disk file here, but there's no need to
    implement the actions of fhandler_disk_file::dup and
    fhandler_disk_file::fcntl, which do nothing useful in this case beyond
    what the fhandler_base methods do.  (The extra actions are only useful
    when I/O is going to be done on the file.)

Diff:
---
 winsup/cygwin/fhandler.h               |  1 +
 winsup/cygwin/fhandler_socket_local.cc | 16 ++++++++++++++++
 2 files changed, 17 insertions(+)

diff --git a/winsup/cygwin/fhandler.h b/winsup/cygwin/fhandler.h
index c54780e..1b477f6 100644
--- a/winsup/cygwin/fhandler.h
+++ b/winsup/cygwin/fhandler.h
@@ -836,6 +836,7 @@ class fhandler_socket_local: public fhandler_socket_wsock
 
   int open (int flags, mode_t mode = 0);
   int close ();
+  int fcntl (int cmd, intptr_t);
   int __reg2 fstat (struct stat *buf);
   int __reg2 fstatvfs (struct statvfs *buf);
   int __reg1 fchmod (mode_t newmode);
diff --git a/winsup/cygwin/fhandler_socket_local.cc b/winsup/cygwin/fhandler_socket_local.cc
index 76815a6..8bfba22 100644
--- a/winsup/cygwin/fhandler_socket_local.cc
+++ b/winsup/cygwin/fhandler_socket_local.cc
@@ -628,6 +628,11 @@ fhandler_socket_local::af_local_set_secret (char *buf)
 int
 fhandler_socket_local::dup (fhandler_base *child, int flags)
 {
+  if (get_flags () & O_PATH)
+    /* We're viewing the socket as a disk file, but fhandler_base::dup
+       suffices here. */
+    return fhandler_base::dup (child, flags);
+
   fhandler_socket_local *fhs = (fhandler_socket_local *) child;
   fhs->set_sun_path (get_sun_path ());
   fhs->set_peer_sun_path (get_peer_sun_path ());
@@ -654,6 +659,17 @@ fhandler_socket_local::close ()
     return fhandler_socket_wsock::close ();
 }
 
+int
+fhandler_socket_local::fcntl (int cmd, intptr_t arg)
+{
+  if (get_flags () & O_PATH)
+    /* We're viewing the socket as a disk file, but
+       fhandler_base::fcntl suffices here. */
+    return fhandler_base::fcntl (cmd, arg);
+  else
+    return fhandler_socket_wsock::fcntl (cmd, arg);
+}
+
 int __reg2
 fhandler_socket_local::fstat (struct stat *buf)
 {



More information about the Cygwin-cvs mailing list