From 477121317d01b37d0f6c84f7724487ecf8a9fbbe Mon Sep 17 00:00:00 2001 From: Ken Brown Date: Sat, 25 Jan 2020 13:08:00 -0500 Subject: [PATCH] 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.) --- 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 c54780ef6..1b477f633 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 76815a611..8bfba225a 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) {