[4/5] server: Fix crash when calling GetNamedPipeHandleState on partially closed pipe.
Sebastian Lackner
sebastian at fds-team.de
Mon Nov 23 00:23:45 CST 2015
Signed-off-by: Sebastian Lackner <sebastian at fds-team.de>
---
After the code freeze, we might want to restructure the whole server logic.
However, at the moment, its better to fix only the wineserver crash.
dlls/kernel32/tests/pipe.c | 14 +++++++++++++-
server/named_pipe.c | 13 ++++++++-----
2 files changed, 21 insertions(+), 6 deletions(-)
diff --git a/dlls/kernel32/tests/pipe.c b/dlls/kernel32/tests/pipe.c
index 1095279..842376a 100644
--- a/dlls/kernel32/tests/pipe.c
+++ b/dlls/kernel32/tests/pipe.c
@@ -1387,9 +1387,9 @@ static void test_CreatePipe(void)
static void test_CloseHandle(void)
{
static const char testdata[] = "Hello World";
+ DWORD state, numbytes;
HANDLE hpipe, hfile;
char buffer[32];
- DWORD numbytes;
BOOL ret;
hpipe = CreateNamedPipeA(PIPENAME, PIPE_ACCESS_DUPLEX,
@@ -1425,6 +1425,9 @@ static void test_CloseHandle(void)
ok(ret, "ReadFile failed with %u\n", GetLastError());
ok(numbytes == sizeof(testdata), "expected sizeof(testdata), got %u\n", numbytes);
+ ret = GetNamedPipeHandleStateA(hfile, &state, NULL, NULL, NULL, NULL, 0);
+ ok(ret, "GetNamedPipeHandleState failed with %u\n", GetLastError());
+
SetLastError(0xdeadbeef);
ret = ReadFile(hfile, buffer, 0, &numbytes, NULL);
ok(!ret, "ReadFile unexpectedly succeeded\n");
@@ -1459,6 +1462,9 @@ static void test_CloseHandle(void)
todo_wine ok(ret, "ReadFile failed with %u\n", GetLastError());
ok(numbytes == 0, "expected 0, got %u\n", numbytes);
+ ret = GetNamedPipeHandleStateA(hfile, &state, NULL, NULL, NULL, NULL, 0);
+ ok(ret, "GetNamedPipeHandleState failed with %u\n", GetLastError());
+
SetLastError(0xdeadbeef);
ret = ReadFile(hfile, buffer, 0, &numbytes, NULL);
ok(!ret, "ReadFile unexpectedly succeeded\n");
@@ -1507,6 +1513,9 @@ static void test_CloseHandle(void)
ok(ret, "ReadFile failed with %u\n", GetLastError());
ok(numbytes == sizeof(testdata), "expected sizeof(testdata), got %u\n", numbytes);
+ ret = GetNamedPipeHandleStateA(hpipe, &state, NULL, NULL, NULL, NULL, 0);
+ ok(ret, "GetNamedPipeHandleState failed with %u\n", GetLastError());
+
SetLastError(0xdeadbeef);
ret = ReadFile(hpipe, buffer, 0, &numbytes, NULL);
ok(!ret, "ReadFile unexpectedly succeeded\n");
@@ -1541,6 +1550,9 @@ static void test_CloseHandle(void)
todo_wine ok(ret, "ReadFile failed with %u\n", GetLastError());
ok(numbytes == 0, "expected 0, got %u\n", numbytes);
+ ret = GetNamedPipeHandleStateA(hpipe, &state, NULL, NULL, NULL, NULL, 0);
+ ok(ret, "GetNamedPipeHandleState failed with %u\n", GetLastError());
+
SetLastError(0xdeadbeef);
ret = ReadFile(hpipe, buffer, 0, &numbytes, NULL);
ok(!ret, "ReadFile unexpectedly succeeded\n");
diff --git a/server/named_pipe.c b/server/named_pipe.c
index fbabc5a..1c9143f 100644
--- a/server/named_pipe.c
+++ b/server/named_pipe.c
@@ -1013,11 +1013,14 @@ DECL_HANDLER(get_named_pipe_info)
}
reply->flags = client ? client->pipe_flags : server->pipe_flags;
- reply->sharing = server->pipe->sharing;
- reply->maxinstances = server->pipe->maxinstances;
- reply->instances = server->pipe->instances;
- reply->insize = server->pipe->insize;
- reply->outsize = server->pipe->outsize;
+ if (server)
+ {
+ reply->sharing = server->pipe->sharing;
+ reply->maxinstances = server->pipe->maxinstances;
+ reply->instances = server->pipe->instances;
+ reply->insize = server->pipe->insize;
+ reply->outsize = server->pipe->outsize;
+ }
if (client)
release_object(client);
--
2.6.2
More information about the wine-patches
mailing list