diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2019-02-05 15:32:08 +0100 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2019-02-05 15:32:08 +0100 |
commit | 5628399c8470d3bbf6ca05b3d0f7f0366f1c16f8 (patch) | |
tree | 4c60285a9422c92c1dc1aba2304e89fd21bf06dc | |
parent | b59f5795e69f5477b2be13e858dd1ee47e89b798 (diff) | |
download | cygnal-5628399c8470d3bbf6ca05b3d0f7f0366f1c16f8.tar.gz cygnal-5628399c8470d3bbf6ca05b3d0f7f0366f1c16f8.tar.bz2 cygnal-5628399c8470d3bbf6ca05b3d0f7f0366f1c16f8.zip |
Cygwin: proc fd: fix handling of pipes, sockets, etc
The symlink target of /proc/PID/fd files pointing to pipes and
sockets are just artificial filenames referencing the object using
some internal number. The pipe open code expects a path specifying
process pid and the internal number so it access the right process
and pipe.
- Set the posix path of the pipe to the simple pipe name only,
as it shows up in /proc/PID/fd. A /proc/self prefix is just
as wrong as a /dev/fd prefix.
- Revert thinko in fhandler_pipe::open expecting the name as
/proc/self/fd/... In fact this should never happen.
- Fix up the path before re-opening the pipe instead.
Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
-rw-r--r-- | winsup/cygwin/fhandler_pipe.cc | 7 | ||||
-rw-r--r-- | winsup/cygwin/fhandler_process_fd.cc | 11 | ||||
-rw-r--r-- | winsup/cygwin/syscalls.cc | 4 |
3 files changed, 15 insertions, 7 deletions
diff --git a/winsup/cygwin/fhandler_pipe.cc b/winsup/cygwin/fhandler_pipe.cc index 3a70565de..31e73ceb0 100644 --- a/winsup/cygwin/fhandler_pipe.cc +++ b/winsup/cygwin/fhandler_pipe.cc @@ -73,11 +73,8 @@ fhandler_pipe::open (int flags, mode_t mode) bool inh; bool got_one = false; - if (sscanf (get_name (), "/proc/self/fd/pipe:[%llu]", - (long long *) &uniq_id) == 1) - pid = myself->pid; - else if (sscanf (get_name (), "/proc/%d/fd/pipe:[%llu]", - &pid, (long long *) &uniq_id) < 2) + if (sscanf (get_name (), "/proc/%d/fd/pipe:[%llu]", + &pid, (long long *) &uniq_id) < 2) { set_errno (ENOENT); return 0; diff --git a/winsup/cygwin/fhandler_process_fd.cc b/winsup/cygwin/fhandler_process_fd.cc index 4f326b69a..3bf8b74d8 100644 --- a/winsup/cygwin/fhandler_process_fd.cc +++ b/winsup/cygwin/fhandler_process_fd.cc @@ -13,6 +13,7 @@ details. */ #include "pinfo.h" #include "dtable.h" #include "cygheap.h" +#include "tls_pbuf.h" fhandler_base * fhandler_process_fd::fetch_fh (HANDLE &out_hdl, uint32_t flags) @@ -86,6 +87,16 @@ fhandler_process_fd::fetch_fh (HANDLE &out_hdl, uint32_t flags) CloseHandle (hdl); return NULL; } + /* relative path? This happens for special types like pipes and sockets. */ + if (*pc.get_posix () != '/') + { + tmp_pathbuf tp; + char *fullpath = tp.c_get (); + + stpcpy (stpncpy (fullpath, get_name (), path - get_name ()), + pc.get_posix ()); + pc.set_posix (fullpath); + } fhandler_base *fh = build_fh_pc (pc); if (!fh) { diff --git a/winsup/cygwin/syscalls.cc b/winsup/cygwin/syscalls.cc index d1a1312b1..62b963844 100644 --- a/winsup/cygwin/syscalls.cc +++ b/winsup/cygwin/syscalls.cc @@ -5061,8 +5061,8 @@ pipe_worker (int filedes[2], unsigned int psize, int mode) { cygheap_fdnew fdin; cygheap_fdnew fdout (fdin, false); - char buf[sizeof ("/proc/self/fd/pipe:[9223372036854775807]")]; - __small_sprintf (buf, "/proc/self/fd/pipe:[%D]", fhs[0]->get_plain_ino ()); + char buf[sizeof ("pipe:[9223372036854775807]")]; + __small_sprintf (buf, "pipe:[%D]", fhs[0]->get_plain_ino ()); fhs[0]->pc.set_posix (buf); __small_sprintf (buf, "pipe:[%D]", fhs[1]->get_plain_ino ()); fhs[1]->pc.set_posix (buf); |