Cygwin: AF_UNIX: fix creation of npfs handle
The handle to the device is never needed. As the name impies, FSCTL_PIPE_WAIT works on the file system, not on the device level. Drop opening the device and make sure to open only one handle to NPFS. Signed-off-by: Corinna Vinschen <corinna@vinschen.de>
This commit is contained in:
parent
d69bcdd671
commit
2f2a75b7bb
@ -852,12 +852,6 @@ class sun_name_t
|
|||||||
|
|
||||||
class fhandler_socket_unix : public fhandler_socket
|
class fhandler_socket_unix : public fhandler_socket
|
||||||
{
|
{
|
||||||
enum npfs_hdl_t
|
|
||||||
{
|
|
||||||
NPFS_DEVICE,
|
|
||||||
NPFS_DIR
|
|
||||||
};
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
SRWLOCK conn_lock;
|
SRWLOCK conn_lock;
|
||||||
SRWLOCK bind_lock;
|
SRWLOCK bind_lock;
|
||||||
@ -886,7 +880,7 @@ class fhandler_socket_unix : public fhandler_socket
|
|||||||
void set_pipe_non_blocking (bool nonblocking);
|
void set_pipe_non_blocking (bool nonblocking);
|
||||||
int send_my_name ();
|
int send_my_name ();
|
||||||
int recv_peer_name ();
|
int recv_peer_name ();
|
||||||
static NTSTATUS npfs_handle (HANDLE &nph, npfs_hdl_t type);
|
static NTSTATUS npfs_handle (HANDLE &nph);
|
||||||
HANDLE create_pipe ();
|
HANDLE create_pipe ();
|
||||||
HANDLE create_pipe_instance ();
|
HANDLE create_pipe_instance ();
|
||||||
NTSTATUS open_pipe (HANDLE &ph, PUNICODE_STRING pipe_name);
|
NTSTATUS open_pipe (HANDLE &ph, PUNICODE_STRING pipe_name);
|
||||||
|
@ -620,28 +620,33 @@ fhandler_socket_unix::recv_peer_name ()
|
|||||||
}
|
}
|
||||||
|
|
||||||
NTSTATUS
|
NTSTATUS
|
||||||
fhandler_socket_unix::npfs_handle (HANDLE &nph, npfs_hdl_t type)
|
fhandler_socket_unix::npfs_handle (HANDLE &nph)
|
||||||
{
|
{
|
||||||
static NO_COPY HANDLE npfs_devh;
|
static NO_COPY SRWLOCK npfs_lock;
|
||||||
static NO_COPY HANDLE npfs_dirh;
|
static NO_COPY HANDLE npfs_dirh;
|
||||||
|
|
||||||
HANDLE &npfs_ref = (type == NPFS_DEVICE) ? npfs_devh : npfs_dirh;
|
NTSTATUS status = STATUS_SUCCESS;
|
||||||
PUNICODE_STRING path = (type == NPFS_DEVICE) ? &ro_u_npfs : &ro_u_npfs_dir;
|
|
||||||
NTSTATUS status;
|
|
||||||
OBJECT_ATTRIBUTES attr;
|
OBJECT_ATTRIBUTES attr;
|
||||||
IO_STATUS_BLOCK io;
|
IO_STATUS_BLOCK io;
|
||||||
|
|
||||||
if (!npfs_ref)
|
/* Lockless after first call. */
|
||||||
|
if (npfs_dirh)
|
||||||
{
|
{
|
||||||
InitializeObjectAttributes (&attr, path, 0, NULL, NULL);
|
nph = npfs_dirh;
|
||||||
status = NtOpenFile (&npfs_ref, FILE_READ_ATTRIBUTES | SYNCHRONIZE,
|
return STATUS_SUCCESS;
|
||||||
|
}
|
||||||
|
AcquireSRWLockExclusive (&npfs_lock);
|
||||||
|
if (!npfs_dirh)
|
||||||
|
{
|
||||||
|
InitializeObjectAttributes (&attr, &ro_u_npfs, 0, NULL, NULL);
|
||||||
|
status = NtOpenFile (&npfs_dirh, FILE_READ_ATTRIBUTES | SYNCHRONIZE,
|
||||||
&attr, &io, FILE_SHARE_READ | FILE_SHARE_WRITE,
|
&attr, &io, FILE_SHARE_READ | FILE_SHARE_WRITE,
|
||||||
FILE_SYNCHRONOUS_IO_NONALERT);
|
FILE_SYNCHRONOUS_IO_NONALERT);
|
||||||
if (!NT_SUCCESS (status))
|
|
||||||
return status;
|
|
||||||
}
|
}
|
||||||
nph = npfs_ref;
|
ReleaseSRWLockExclusive (&npfs_lock);
|
||||||
return STATUS_SUCCESS;
|
if (NT_SUCCESS (status))
|
||||||
|
nph = npfs_dirh;
|
||||||
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
HANDLE
|
HANDLE
|
||||||
@ -658,7 +663,7 @@ fhandler_socket_unix::create_pipe ()
|
|||||||
ULONG max_instances;
|
ULONG max_instances;
|
||||||
LARGE_INTEGER timeout;
|
LARGE_INTEGER timeout;
|
||||||
|
|
||||||
status = npfs_handle (npfsh, NPFS_DIR);
|
status = npfs_handle (npfsh);
|
||||||
if (!NT_SUCCESS (status))
|
if (!NT_SUCCESS (status))
|
||||||
{
|
{
|
||||||
__seterrno_from_nt_status (status);
|
__seterrno_from_nt_status (status);
|
||||||
@ -700,7 +705,7 @@ fhandler_socket_unix::create_pipe_instance ()
|
|||||||
ULONG max_instances;
|
ULONG max_instances;
|
||||||
LARGE_INTEGER timeout;
|
LARGE_INTEGER timeout;
|
||||||
|
|
||||||
status = npfs_handle (npfsh, NPFS_DIR);
|
status = npfs_handle (npfsh);
|
||||||
if (!NT_SUCCESS (status))
|
if (!NT_SUCCESS (status))
|
||||||
{
|
{
|
||||||
__seterrno_from_nt_status (status);
|
__seterrno_from_nt_status (status);
|
||||||
@ -738,7 +743,7 @@ fhandler_socket_unix::open_pipe (HANDLE &ph, PUNICODE_STRING pipe_name)
|
|||||||
IO_STATUS_BLOCK io;
|
IO_STATUS_BLOCK io;
|
||||||
ULONG sharing;
|
ULONG sharing;
|
||||||
|
|
||||||
status = npfs_handle (npfsh, NPFS_DIR);
|
status = npfs_handle (npfsh);
|
||||||
if (!NT_SUCCESS (status))
|
if (!NT_SUCCESS (status))
|
||||||
return status;
|
return status;
|
||||||
access = GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE;
|
access = GENERIC_READ | GENERIC_WRITE | SYNCHRONIZE;
|
||||||
@ -996,7 +1001,7 @@ fhandler_socket_unix::wait_pipe_thread (PUNICODE_STRING pipe_name)
|
|||||||
LONGLONG stamp;
|
LONGLONG stamp;
|
||||||
HANDLE ph = NULL;
|
HANDLE ph = NULL;
|
||||||
|
|
||||||
status = npfs_handle (npfsh, NPFS_DEVICE);
|
status = npfs_handle (npfsh);
|
||||||
if (!NT_SUCCESS (status))
|
if (!NT_SUCCESS (status))
|
||||||
{
|
{
|
||||||
error = geterrno_from_nt_status (status);
|
error = geterrno_from_nt_status (status);
|
||||||
|
@ -149,8 +149,7 @@ const int __collate_load_error = 0;
|
|||||||
extern UNICODE_STRING _RDATA ro_u_natdir = _ROU (L"Directory");
|
extern UNICODE_STRING _RDATA ro_u_natdir = _ROU (L"Directory");
|
||||||
extern UNICODE_STRING _RDATA ro_u_natsyml = _ROU (L"SymbolicLink");
|
extern UNICODE_STRING _RDATA ro_u_natsyml = _ROU (L"SymbolicLink");
|
||||||
extern UNICODE_STRING _RDATA ro_u_natdev = _ROU (L"Device");
|
extern UNICODE_STRING _RDATA ro_u_natdev = _ROU (L"Device");
|
||||||
extern UNICODE_STRING _RDATA ro_u_npfs = _ROU (L"\\Device\\NamedPipe");
|
extern UNICODE_STRING _RDATA ro_u_npfs = _ROU (L"\\Device\\NamedPipe\\");
|
||||||
extern UNICODE_STRING _RDATA ro_u_npfs_dir = _ROU (L"\\Device\\NamedPipe\\");
|
|
||||||
#undef _ROU
|
#undef _ROU
|
||||||
|
|
||||||
/* This is an exported copy of environ which can be used by DLLs
|
/* This is an exported copy of environ which can be used by DLLs
|
||||||
|
Loading…
x
Reference in New Issue
Block a user