Sebastian Lackner : server: Fix crash when calling GetNamedPipeHandleState on partially closed pipe.

Alexandre Julliard julliard at wine.codeweavers.com
Mon Nov 23 09:59:46 CST 2015


Module: wine
Branch: master
Commit: ee02530bc4ab4a85f6b7b0db847b8fe566f76f16
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=ee02530bc4ab4a85f6b7b0db847b8fe566f76f16

Author: Sebastian Lackner <sebastian at fds-team.de>
Date:   Mon Nov 23 07:23:45 2015 +0100

server: Fix crash when calling GetNamedPipeHandleState on partially closed pipe.

Signed-off-by: Sebastian Lackner <sebastian at fds-team.de>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 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);




More information about the wine-cvs mailing list