From 9eaaadbb47033584055b90d5f91cd824686cc300 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Mon, 16 Apr 2007 14:32:18 +0200 Subject: [PATCH] kernel32: Use the correct access rights when opening named pipes. --- dlls/kernel32/sync.c | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/dlls/kernel32/sync.c b/dlls/kernel32/sync.c index 7c15fd800dd..949e1b75b77 100644 --- a/dlls/kernel32/sync.c +++ b/dlls/kernel32/sync.c @@ -1114,7 +1114,7 @@ HANDLE WINAPI CreateNamedPipeW( LPCWSTR name, DWORD dwOpenMode, HANDLE handle; UNICODE_STRING nt_name; OBJECT_ATTRIBUTES attr; - DWORD options; + DWORD access, options; BOOLEAN pipe_type, read_mode, non_block; NTSTATUS status; IO_STATUS_BLOCK iosb; @@ -1144,13 +1144,27 @@ HANDLE WINAPI CreateNamedPipeW( LPCWSTR name, DWORD dwOpenMode, attr.SecurityDescriptor = sa ? sa->lpSecurityDescriptor : NULL; attr.SecurityQualityOfService = NULL; - options = 0; + switch(dwOpenMode & 3) + { + case PIPE_ACCESS_INBOUND: + options = FILE_PIPE_INBOUND; + access = GENERIC_READ; + break; + case PIPE_ACCESS_OUTBOUND: + options = FILE_PIPE_OUTBOUND; + access = GENERIC_WRITE; + break; + case PIPE_ACCESS_DUPLEX: + options = FILE_PIPE_FULL_DUPLEX; + access = GENERIC_READ | GENERIC_WRITE; + break; + default: + SetLastError( ERROR_INVALID_PARAMETER ); + return INVALID_HANDLE_VALUE; + } + access |= SYNCHRONIZE; if (dwOpenMode & FILE_FLAG_WRITE_THROUGH) options |= FILE_WRITE_THROUGH; if (!(dwOpenMode & FILE_FLAG_OVERLAPPED)) options |= FILE_SYNCHRONOUS_IO_ALERT; - if ((dwOpenMode & PIPE_ACCESS_DUPLEX) == PIPE_ACCESS_DUPLEX) - options |= FILE_PIPE_FULL_DUPLEX; - else if (dwOpenMode & PIPE_ACCESS_INBOUND) options |= FILE_PIPE_INBOUND; - else if (dwOpenMode & PIPE_ACCESS_OUTBOUND) options |= FILE_PIPE_OUTBOUND; pipe_type = (dwPipeMode & PIPE_TYPE_MESSAGE) ? TRUE : FALSE; read_mode = (dwPipeMode & PIPE_READMODE_MESSAGE) ? TRUE : FALSE; non_block = (dwPipeMode & PIPE_NOWAIT) ? TRUE : FALSE; @@ -1159,9 +1173,9 @@ HANDLE WINAPI CreateNamedPipeW( LPCWSTR name, DWORD dwOpenMode, timeout.QuadPart = (ULONGLONG)nDefaultTimeOut * -10000; SetLastError(0); - - status = NtCreateNamedPipeFile(&handle, GENERIC_READ|GENERIC_WRITE, &attr, &iosb, - 0, FILE_OVERWRITE_IF, options, pipe_type, + + status = NtCreateNamedPipeFile(&handle, access, &attr, &iosb, 0, + FILE_OVERWRITE_IF, options, pipe_type, read_mode, non_block, nMaxInstances, nInBufferSize, nOutBufferSize, &timeout);