From 7477792b4cf9e089388a18cacfb69567ddc310f3 Mon Sep 17 00:00:00 2001 From: Zebediah Figura Date: Tue, 10 Oct 2017 18:40:43 +0200 Subject: [PATCH] server: FSCTL_PIPE_LISTEN on a pipe client should return STATUS_ILLEGAL_FUNCTION. Signed-off-by: Zebediah Figura Signed-off-by: Jacek Caban Signed-off-by: Alexandre Julliard --- dlls/kernel32/tests/pipe.c | 6 ++++++ dlls/ntdll/tests/pipe.c | 3 +++ server/named_pipe.c | 4 ++++ 3 files changed, 13 insertions(+) diff --git a/dlls/kernel32/tests/pipe.c b/dlls/kernel32/tests/pipe.c index 13afa109f97..9ecb916e72a 100644 --- a/dlls/kernel32/tests/pipe.c +++ b/dlls/kernel32/tests/pipe.c @@ -224,6 +224,12 @@ static void test_CreateNamedPipe(int pipemode) ok(GetLastError() == ERROR_SEM_TIMEOUT, "wrong error %u\n", GetLastError()); + /* Test ConnectNamedPipe() in both directions */ + ok(!ConnectNamedPipe(hnp, NULL), "ConnectNamedPipe(server) succeeded\n"); + ok(GetLastError() == ERROR_PIPE_CONNECTED, "expected ERROR_PIPE_CONNECTED, got %u\n", GetLastError()); + ok(!ConnectNamedPipe(hFile, NULL), "ConnectNamedPipe(client) succeeded\n"); + ok(GetLastError() == ERROR_INVALID_FUNCTION, "expected ERROR_INVALID_FUNCTION, got %u\n", GetLastError()); + /* don't try to do i/o if one side couldn't be opened, as it hangs */ if (hFile != INVALID_HANDLE_VALUE) { HANDLE hFile2; diff --git a/dlls/ntdll/tests/pipe.c b/dlls/ntdll/tests/pipe.c index acead4e8354..824eed7c718 100644 --- a/dlls/ntdll/tests/pipe.c +++ b/dlls/ntdll/tests/pipe.c @@ -256,6 +256,9 @@ static void test_create(void) res, access[k], sharing[j]); ok(info.NamedPipeConfiguration == pipe_config[j], "wrong duplex status for pipe: %d, expected %d\n", info.NamedPipeConfiguration, pipe_config[j]); + + res = listen_pipe(hclient, hEvent, &iosb, FALSE); + ok(res == STATUS_ILLEGAL_FUNCTION, "expected STATUS_ILLEGAL_FUNCTION, got %x\n", res); CloseHandle(hclient); } diff --git a/server/named_pipe.c b/server/named_pipe.c index 57960896b15..f594664542e 100644 --- a/server/named_pipe.c +++ b/server/named_pipe.c @@ -876,6 +876,10 @@ static int pipe_client_ioctl( struct fd *fd, ioctl_code_t code, struct async *as switch(code) { + case FSCTL_PIPE_LISTEN: + set_error( STATUS_ILLEGAL_FUNCTION ); + return 0; + case FSCTL_PIPE_PEEK: return pipe_end_peek( &client->pipe_end );