[PATCH] ntdll: Allow special characters in pipe names.
From: Michael Müller <michael(a)fds-team.de> Based on a patch by Valentyn Pavliuchenko. Fixes bug 28995. Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com> --- dlls/kernel32/tests/pipe.c | 13 +++++++++++++ dlls/ntdll/directory.c | 14 ++++++++++---- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/dlls/kernel32/tests/pipe.c b/dlls/kernel32/tests/pipe.c index fa677cf..b74232c 100644 --- a/dlls/kernel32/tests/pipe.c +++ b/dlls/kernel32/tests/pipe.c @@ -627,6 +627,19 @@ static void test_CreateNamedPipe(int pipemode) ok(CloseHandle(hnp), "CloseHandle\n"); + hnp = CreateNamedPipeA("\\\\.\\pipe\\test->pipe.c", PIPE_ACCESS_DUPLEX, pipemode | PIPE_WAIT, + /* nMaxInstances */ 1, + /* nOutBufSize */ 1024, + /* nInBufSize */ 1024, + /* nDefaultWait */ NMPWAIT_USE_DEFAULT_WAIT, + /* lpSecurityAttrib */ NULL); + ok(hnp != INVALID_HANDLE_VALUE, "CreateNamedPipe failed: %u\n", GetLastError()); + + hFile = CreateFileA("\\\\.\\pipe\\test->pipe.c", 0, 0, NULL, OPEN_EXISTING, 0, 0); + ok(hFile != INVALID_HANDLE_VALUE, "CreateFile failed: %u\n", GetLastError()); + ok(CloseHandle(hFile), "CloseHandle\n"); + ok(CloseHandle(hnp), "CloseHandle\n"); + if (winetest_debug > 1) trace("test_CreateNamedPipe returning\n"); } diff --git a/dlls/ntdll/directory.c b/dlls/ntdll/directory.c index 4655a634..e6754ec 100644 --- a/dlls/ntdll/directory.c +++ b/dlls/ntdll/directory.c @@ -2819,6 +2819,7 @@ NTSTATUS CDECL wine_nt_to_unix_file_name( const UNICODE_STRING *nameW, ANSI_STRI UINT disposition, BOOLEAN check_case ) { static const WCHAR unixW[] = {'u','n','i','x'}; + static const WCHAR pipeW[] = {'p','i','p','e'}; static const WCHAR invalid_charsW[] = { INVALID_NT_CHARS, 0 }; NTSTATUS status = STATUS_SUCCESS; @@ -2829,6 +2830,7 @@ NTSTATUS CDECL wine_nt_to_unix_file_name( const UNICODE_STRING *nameW, ANSI_STRI int pos, ret, name_len, unix_len, prefix_len, used_default; WCHAR prefix[MAX_DIR_ENTRY_LEN]; BOOLEAN is_unix = FALSE; + BOOLEAN is_pipe = FALSE; name = nameW->Buffer; name_len = nameW->Length / sizeof(WCHAR); @@ -2862,13 +2864,17 @@ NTSTATUS CDECL wine_nt_to_unix_file_name( const UNICODE_STRING *nameW, ANSI_STRI name += prefix_len; name_len -= prefix_len; - /* check for invalid characters (all chars except 0 are valid for unix) */ - is_unix = (prefix_len == 4 && !memcmp( prefix, unixW, sizeof(unixW) )); - if (is_unix) + /* check for invalid characters (all chars except 0 are valid for unix and pipes) */ + if (prefix_len == 4) + { + is_unix = !memcmp( prefix, unixW, sizeof(unixW) ); + is_pipe = !memcmp( prefix, pipeW, sizeof(pipeW) ); + } + if (is_unix || is_pipe) { for (p = name; p < name + name_len; p++) if (!*p) return STATUS_OBJECT_NAME_INVALID; - check_case = TRUE; + check_case |= is_unix; } else { -- 2.7.4
Zebediah Figura <z.figura12(a)gmail.com> writes:
From: Michael Müller <michael(a)fds-team.de>
Based on a patch by Valentyn Pavliuchenko.
Fixes bug 28995.
Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com> --- dlls/kernel32/tests/pipe.c | 13 +++++++++++++ dlls/ntdll/directory.c | 14 ++++++++++---- 2 files changed, 23 insertions(+), 4 deletions(-)
There shouldn't be any need to handle pipes differently; file name checks for all devices should be done on the server side. Probably the existing check needs to be moved to the point where we are actually looking at the filesystem. -- Alexandre Julliard julliard(a)winehq.org
participants (2)
-
Alexandre Julliard -
Zebediah Figura