From b079a89e259e11b5080725c349a7ffea161f4837 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Sat, 31 Oct 2009 13:24:43 +0000 Subject: [PATCH] * transport_pipes.h (PIPE_NAME_PREFIX): New define. (PIPE_NAME_SUFFIX): Ditto. (class transport_layer_pipes): Convert _pipe_name from char pointer to wchar_t array. * transport_pipes.cc (transport_layer_pipes::transport_layer_pipes): Accommodate the fact that _pipe_name is a wchar_t array, rather than a char pointer. (transport_layer_pipes::transport_layer_pipes): Initialize _pipe_name with variable pipe name based in installation key fetched from Cygwin DLL. (transport_layer_pipes::accept): Call CreateNamedPipeW explicitely. (transport_layer_pipes::connect): Call CreateFileW and WaitNamedPipeW explicitely. --- winsup/cygserver/ChangeLog | 16 +++++++++++ winsup/cygserver/transport_pipes.cc | 41 ++++++++++++++++++----------- winsup/cygserver/transport_pipes.h | 5 +++- 3 files changed, 46 insertions(+), 16 deletions(-) diff --git a/winsup/cygserver/ChangeLog b/winsup/cygserver/ChangeLog index d7c7ed9d9..dbc28ba54 100644 --- a/winsup/cygserver/ChangeLog +++ b/winsup/cygserver/ChangeLog @@ -1,3 +1,19 @@ +2009-10-31 Corinna Vinschen + + * transport_pipes.h (PIPE_NAME_PREFIX): New define. + (PIPE_NAME_SUFFIX): Ditto. + (class transport_layer_pipes): Convert _pipe_name from char pointer + to wchar_t array. + * transport_pipes.cc (transport_layer_pipes::transport_layer_pipes): + Accommodate the fact that _pipe_name is a wchar_t array, rather than + a char pointer. + (transport_layer_pipes::transport_layer_pipes): Initialize _pipe_name + with variable pipe name based in installation key fetched from Cygwin + DLL. + (transport_layer_pipes::accept): Call CreateNamedPipeW explicitely. + (transport_layer_pipes::connect): Call CreateFileW and WaitNamedPipeW + explicitely. + 2009-08-18 Corinna Vinschen * Makefile.in (CXXFLAGS): Allow override. diff --git a/winsup/cygserver/transport_pipes.cc b/winsup/cygserver/transport_pipes.cc index 9fdf75899..1a67d2044 100644 --- a/winsup/cygserver/transport_pipes.cc +++ b/winsup/cygserver/transport_pipes.cc @@ -1,6 +1,6 @@ /* transport_pipes.cc - Copyright 2001, 2002, 2003, 2004 Red Hat Inc. + Copyright 2001, 2002, 2003, 2004, 2009 Red Hat Inc. Written by Robert Collins @@ -23,6 +23,8 @@ details. */ #include #include #include +#include +#include #include "cygerrno.h" #include "transport.h" @@ -65,24 +67,33 @@ initialise_pipe_instance_lock () #ifndef __INSIDE_CYGWIN__ transport_layer_pipes::transport_layer_pipes (const HANDLE hPipe) - : _pipe_name (""), - _hPipe (hPipe), + : _hPipe (hPipe), _is_accepted_endpoint (true), _is_listening_endpoint (false) { assert (_hPipe); assert (_hPipe != INVALID_HANDLE_VALUE); - + _pipe_name[0] = L'\0'; } #endif /* !__INSIDE_CYGWIN__ */ transport_layer_pipes::transport_layer_pipes () - : _pipe_name ("\\\\.\\pipe\\cygwin_lpc"), - _hPipe (NULL), + : _hPipe (NULL), _is_accepted_endpoint (false), _is_listening_endpoint (false) { +#ifdef __INSIDE_CYGWIN__ + extern WCHAR installation_key_buf[18]; + wcpcpy (wcpcpy (wcpcpy (_pipe_name, PIPE_NAME_PREFIX), installation_key_buf), + PIPE_NAME_SUFFIX); +#else + wchar_t cyg_instkey[18]; + + wchar_t *p = wcpcpy (_pipe_name, PIPE_NAME_PREFIX); + if (cygwin_internal (CW_GET_INSTKEY, cyg_instkey)) + wcpcpy (wcpcpy (p, cyg_instkey), PIPE_NAME_SUFFIX); +#endif } transport_layer_pipes::~transport_layer_pipes () @@ -124,7 +135,7 @@ transport_layer_pipes::accept (bool *const recoverable) const bool first_instance = (pipe_instance == 0); const HANDLE accept_pipe = - CreateNamedPipe (_pipe_name, + CreateNamedPipeW (_pipe_name, (PIPE_ACCESS_DUPLEX | (first_instance ? FILE_FLAG_FIRST_PIPE_INSTANCE : 0)), (PIPE_TYPE_BYTE | PIPE_WAIT), @@ -270,13 +281,13 @@ transport_layer_pipes::connect () while (rc) { - _hPipe = CreateFile (_pipe_name, - GENERIC_READ | GENERIC_WRITE, - FILE_SHARE_READ | FILE_SHARE_WRITE, - &sec_all_nih, - OPEN_EXISTING, - SECURITY_IMPERSONATION, - NULL); + _hPipe = CreateFileW (_pipe_name, + GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + &sec_all_nih, + OPEN_EXISTING, + SECURITY_IMPERSONATION, + NULL); if (_hPipe != INVALID_HANDLE_VALUE) { @@ -302,7 +313,7 @@ transport_layer_pipes::connect () * with ERROR_FILE_NOT_FOUND. */ while (retries != MAX_WAIT_NAMED_PIPE_RETRY - && !(rc = WaitNamedPipe (_pipe_name, WAIT_NAMED_PIPE_TIMEOUT))) + && !(rc = WaitNamedPipeW (_pipe_name, WAIT_NAMED_PIPE_TIMEOUT))) { if (GetLastError () == ERROR_FILE_NOT_FOUND) Sleep (0); // Give the server a chance. diff --git a/winsup/cygserver/transport_pipes.h b/winsup/cygserver/transport_pipes.h index 7265a88f8..136812106 100644 --- a/winsup/cygserver/transport_pipes.h +++ b/winsup/cygserver/transport_pipes.h @@ -13,6 +13,9 @@ details. */ #ifndef _TRANSPORT_PIPES_H #define _TRANSPORT_PIPES_H +#define PIPE_NAME_PREFIX L"\\\\.\\pipe\\cygwin-" +#define PIPE_NAME_SUFFIX L"-lpc" + /* Named pipes based transport, for security on NT */ class transport_layer_pipes : public transport_layer_base { @@ -36,7 +39,7 @@ public: virtual ~transport_layer_pipes (); private: - const char *const _pipe_name; + wchar_t _pipe_name[40]; HANDLE _hPipe; const bool _is_accepted_endpoint; bool _is_listening_endpoint;