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>
This commit is contained in:
parent
b59f5795e6
commit
5628399c84
|
@ -73,11 +73,8 @@ fhandler_pipe::open (int flags, mode_t mode)
|
||||||
bool inh;
|
bool inh;
|
||||||
bool got_one = false;
|
bool got_one = false;
|
||||||
|
|
||||||
if (sscanf (get_name (), "/proc/self/fd/pipe:[%llu]",
|
if (sscanf (get_name (), "/proc/%d/fd/pipe:[%llu]",
|
||||||
(long long *) &uniq_id) == 1)
|
&pid, (long long *) &uniq_id) < 2)
|
||||||
pid = myself->pid;
|
|
||||||
else if (sscanf (get_name (), "/proc/%d/fd/pipe:[%llu]",
|
|
||||||
&pid, (long long *) &uniq_id) < 2)
|
|
||||||
{
|
{
|
||||||
set_errno (ENOENT);
|
set_errno (ENOENT);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -13,6 +13,7 @@ details. */
|
||||||
#include "pinfo.h"
|
#include "pinfo.h"
|
||||||
#include "dtable.h"
|
#include "dtable.h"
|
||||||
#include "cygheap.h"
|
#include "cygheap.h"
|
||||||
|
#include "tls_pbuf.h"
|
||||||
|
|
||||||
fhandler_base *
|
fhandler_base *
|
||||||
fhandler_process_fd::fetch_fh (HANDLE &out_hdl, uint32_t flags)
|
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);
|
CloseHandle (hdl);
|
||||||
return NULL;
|
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);
|
fhandler_base *fh = build_fh_pc (pc);
|
||||||
if (!fh)
|
if (!fh)
|
||||||
{
|
{
|
||||||
|
|
|
@ -5061,8 +5061,8 @@ pipe_worker (int filedes[2], unsigned int psize, int mode)
|
||||||
{
|
{
|
||||||
cygheap_fdnew fdin;
|
cygheap_fdnew fdin;
|
||||||
cygheap_fdnew fdout (fdin, false);
|
cygheap_fdnew fdout (fdin, false);
|
||||||
char buf[sizeof ("/proc/self/fd/pipe:[9223372036854775807]")];
|
char buf[sizeof ("pipe:[9223372036854775807]")];
|
||||||
__small_sprintf (buf, "/proc/self/fd/pipe:[%D]", fhs[0]->get_plain_ino ());
|
__small_sprintf (buf, "pipe:[%D]", fhs[0]->get_plain_ino ());
|
||||||
fhs[0]->pc.set_posix (buf);
|
fhs[0]->pc.set_posix (buf);
|
||||||
__small_sprintf (buf, "pipe:[%D]", fhs[1]->get_plain_ino ());
|
__small_sprintf (buf, "pipe:[%D]", fhs[1]->get_plain_ino ());
|
||||||
fhs[1]->pc.set_posix (buf);
|
fhs[1]->pc.set_posix (buf);
|
||||||
|
|
Loading…
Reference in New Issue