Added patch to assign random name when trying to create Window Station without name.

This commit is contained in:
Sebastian Lackner 2016-02-24 20:16:37 +01:00
parent 5dce108e77
commit f9f999d16e
5 changed files with 196 additions and 6 deletions

View File

@ -4011,19 +4011,26 @@ fi
# Patchset server-Desktop_Refcount
# |
# | Modified files:
# | * programs/explorer/desktop.c, server/async.c, server/atom.c, server/change.c, server/clipboard.c, server/completion.c,
# | server/console.c, server/debugger.c, server/device.c, server/directory.c, server/event.c, server/fd.c, server/file.c,
# | server/handle.c, server/handle.h, server/hook.c, server/mailslot.c, server/mapping.c, server/mutex.c,
# | server/named_pipe.c, server/object.c, server/object.h, server/process.c, server/queue.c, server/registry.c,
# | server/request.c, server/semaphore.c, server/serial.c, server/signal.c, server/snapshot.c, server/sock.c,
# | server/symlink.c, server/thread.c, server/timer.c, server/token.c, server/winstation.c
# | * dlls/user32/tests/winstation.c, dlls/user32/winstation.c, include/winuser.h, programs/explorer/desktop.c,
# | server/async.c, server/atom.c, server/change.c, server/clipboard.c, server/completion.c, server/console.c,
# | server/debugger.c, server/device.c, server/directory.c, server/event.c, server/fd.c, server/file.c, server/handle.c,
# | server/handle.h, server/hook.c, server/mailslot.c, server/mapping.c, server/mutex.c, server/named_pipe.c,
# | server/object.c, server/object.h, server/process.c, server/queue.c, server/registry.c, server/request.c,
# | server/semaphore.c, server/serial.c, server/signal.c, server/snapshot.c, server/sock.c, server/symlink.c,
# | server/thread.c, server/timer.c, server/token.c, server/winstation.c
# |
if test "$enable_server_Desktop_Refcount" -eq 1; then
patch_apply server-Desktop_Refcount/0001-server-Introduce-a-new-alloc_handle-object-callback..patch
patch_apply server-Desktop_Refcount/0002-server-Track-desktop-handle-count-more-correctly.patch
patch_apply server-Desktop_Refcount/0003-user32-Implement-CWF_CREATE_ONLY-flag-for-CreateWind.patch
patch_apply server-Desktop_Refcount/0004-user32-tests-Add-additional-tests-for-window-station.patch
patch_apply server-Desktop_Refcount/0005-server-Assign-random-name-when-no-name-was-passed-to.patch
(
echo '+ { "Sebastian Lackner", "server: Introduce a new alloc_handle object callback.", 2 },';
echo '+ { "Sebastian Lackner", "server: Track desktop handle count more correctly.", 1 },';
echo '+ { "Sebastian Lackner", "user32: Implement CWF_CREATE_ONLY flag for CreateWindowStation.", 1 },';
echo '+ { "Sebastian Lackner", "user32/tests: Add additional tests for window station name.", 1 },';
echo '+ { "Sebastian Lackner", "server: Assign random name when no name was passed to create_winstation.", 1 },';
) >> "$patchlist"
fi

View File

@ -0,0 +1,71 @@
From 4a137148ed5f42a6f598eba630d668d2b9613b4c Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Wed, 24 Feb 2016 17:49:10 +0100
Subject: user32: Implement CWF_CREATE_ONLY flag for CreateWindowStation.
---
dlls/user32/winstation.c | 11 ++++++-----
include/winuser.h | 2 ++
2 files changed, 8 insertions(+), 5 deletions(-)
diff --git a/dlls/user32/winstation.c b/dlls/user32/winstation.c
index 61add76..70715ad 100644
--- a/dlls/user32/winstation.c
+++ b/dlls/user32/winstation.c
@@ -80,26 +80,26 @@ static HANDLE get_winstations_dir_handle(void)
/***********************************************************************
* CreateWindowStationA (USER32.@)
*/
-HWINSTA WINAPI CreateWindowStationA( LPCSTR name, DWORD reserved, ACCESS_MASK access,
+HWINSTA WINAPI CreateWindowStationA( LPCSTR name, DWORD flags, ACCESS_MASK access,
LPSECURITY_ATTRIBUTES sa )
{
WCHAR buffer[MAX_PATH];
- if (!name) return CreateWindowStationW( NULL, reserved, access, sa );
+ if (!name) return CreateWindowStationW( NULL, flags, access, sa );
if (!MultiByteToWideChar( CP_ACP, 0, name, -1, buffer, MAX_PATH ))
{
SetLastError( ERROR_FILENAME_EXCED_RANGE );
return 0;
}
- return CreateWindowStationW( buffer, reserved, access, sa );
+ return CreateWindowStationW( buffer, flags, access, sa );
}
/***********************************************************************
* CreateWindowStationW (USER32.@)
*/
-HWINSTA WINAPI CreateWindowStationW( LPCWSTR name, DWORD reserved, ACCESS_MASK access,
+HWINSTA WINAPI CreateWindowStationW( LPCWSTR name, DWORD flags, ACCESS_MASK access,
LPSECURITY_ATTRIBUTES sa )
{
HANDLE ret;
@@ -114,7 +114,8 @@ HWINSTA WINAPI CreateWindowStationW( LPCWSTR name, DWORD reserved, ACCESS_MASK a
{
req->flags = 0;
req->access = access;
- req->attributes = OBJ_CASE_INSENSITIVE | OBJ_OPENIF |
+ req->attributes = OBJ_CASE_INSENSITIVE |
+ ((flags & CWF_CREATE_ONLY) ? 0 : OBJ_OPENIF) |
((sa && sa->bInheritHandle) ? OBJ_INHERIT : 0);
req->rootdir = wine_server_obj_handle( get_winstations_dir_handle() );
wine_server_add_data( req, name, len * sizeof(WCHAR) );
diff --git a/include/winuser.h b/include/winuser.h
index fa3e661..64dd6e7 100644
--- a/include/winuser.h
+++ b/include/winuser.h
@@ -101,6 +101,8 @@ typedef void* HPOWERNOTIFY;
#define WSF_VISIBLE 1
#define DF_ALLOWOTHERACCOUNTHOOK 1
+#define CWF_CREATE_ONLY 0x01
+
typedef struct tagUSEROBJECTFLAGS {
BOOL fInherit;
BOOL fReserved;
--
2.7.1

View File

@ -0,0 +1,38 @@
From 15e83e517e6b227a55ecee9541cca567b94701b8 Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Wed, 24 Feb 2016 17:51:48 +0100
Subject: user32/tests: Add additional tests for window station name.
---
dlls/user32/tests/winstation.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/dlls/user32/tests/winstation.c b/dlls/user32/tests/winstation.c
index e49420b..4a553ca 100644
--- a/dlls/user32/tests/winstation.c
+++ b/dlls/user32/tests/winstation.c
@@ -114,6 +114,8 @@ static void test_handles(void)
DWORD id, flags, le;
ATOM atom;
char buffer[20];
+ DWORD size;
+ BOOL ret;
/* win stations */
@@ -215,6 +217,12 @@ static void test_handles(void)
w2 = CreateWindowStationA( "", 0, WINSTA_ALL_ACCESS, NULL );
ok( w2 != 0, "create station failed err %u\n", GetLastError() );
+ memset(buffer, 0, sizeof(buffer));
+ ret = GetUserObjectInformationA( w2, UOI_NAME, buffer, sizeof(buffer), &size );
+ ok( ret, "GetUserObjectInformationA returned %x\n", ret );
+ todo_wine ok( !memcmp(buffer, "Service-0x0-", 12), "unexpected WindowStation name '%s'\n", buffer );
+ todo_wine ok( buffer[strlen(buffer) - 1] == '$', "unexpected WindowStation name '%s'\n", buffer );
+
SetLastError( 0xdeadbeef );
w3 = OpenWindowStationA( "", TRUE, WINSTA_ALL_ACCESS );
todo_wine
--
2.7.1

View File

@ -0,0 +1,73 @@
From ca6e61e6b9c6813d684eb60d074d3036f10d166e Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Wed, 24 Feb 2016 19:18:52 +0100
Subject: server: Assign random name when no name was passed to
create_winstation.
---
dlls/user32/tests/winstation.c | 4 ++--
server/winstation.c | 24 +++++++++++++++++++++++-
2 files changed, 25 insertions(+), 3 deletions(-)
diff --git a/dlls/user32/tests/winstation.c b/dlls/user32/tests/winstation.c
index 4a553ca..b4a1a49 100644
--- a/dlls/user32/tests/winstation.c
+++ b/dlls/user32/tests/winstation.c
@@ -220,8 +220,8 @@ static void test_handles(void)
memset(buffer, 0, sizeof(buffer));
ret = GetUserObjectInformationA( w2, UOI_NAME, buffer, sizeof(buffer), &size );
ok( ret, "GetUserObjectInformationA returned %x\n", ret );
- todo_wine ok( !memcmp(buffer, "Service-0x0-", 12), "unexpected WindowStation name '%s'\n", buffer );
- todo_wine ok( buffer[strlen(buffer) - 1] == '$', "unexpected WindowStation name '%s'\n", buffer );
+ ok( !memcmp(buffer, "Service-0x0-", 12), "unexpected WindowStation name '%s'\n", buffer );
+ ok( buffer[strlen(buffer) - 1] == '$', "unexpected WindowStation name '%s'\n", buffer );
SetLastError( 0xdeadbeef );
w3 = OpenWindowStationA( "", TRUE, WINSTA_ALL_ACCESS );
diff --git a/server/winstation.c b/server/winstation.c
index 0034343..39131d5 100644
--- a/server/winstation.c
+++ b/server/winstation.c
@@ -111,9 +111,30 @@ static const struct object_ops desktop_ops =
static struct winstation *create_winstation( struct object *root, const struct unicode_str *name,
unsigned int attr, unsigned int flags )
{
+ static const WCHAR formatW[] = {'S','e','r','v','i','c','e','-','0','x','0','-','%','x','$',0};
+ static unsigned int id = 0x10000;
struct winstation *winstation;
+ struct unicode_str default_name;
+ WCHAR buffer[32];
- if ((winstation = create_named_object( root, &winstation_ops, name, attr, NULL )))
+ if (name->len)
+ {
+ winstation = create_named_object( root, &winstation_ops, name, attr, NULL );
+ goto done;
+ }
+
+ do
+ {
+ if (!++id) id = 1; /* avoid an id of 0 */
+ sprintfW( buffer, formatW, id );
+ default_name.str = buffer;
+ default_name.len = strlenW( buffer ) * sizeof(WCHAR);
+ winstation = create_named_object( root, &winstation_ops, &default_name, attr & ~OBJ_OPENIF, NULL );
+ }
+ while (!winstation && get_error() == STATUS_OBJECT_NAME_COLLISION);
+
+done:
+ if (winstation)
{
if (get_error() != STATUS_OBJECT_NAME_EXISTS)
{
@@ -131,6 +152,7 @@ static struct winstation *create_winstation( struct object *root, const struct u
}
else clear_error();
}
+
return winstation;
}
--
2.7.1

View File

@ -1 +1,2 @@
Fixes: Fix possible leak of explorer.exe processes and implement proper desktop refcounting
Fixes: Assign random name when trying to create Window Station without name