Nikolay Sivov : ntdll: Allow NULL return length argument in NtAdjustPrivilegesToken().
Alexandre Julliard
julliard at winehq.org
Mon Dec 2 13:37:51 CST 2013
Module: wine
Branch: master
Commit: fd65b0a1c3f5f981cc110ca9e6a0edb6323e1296
URL: http://source.winehq.org/git/wine.git/?a=commit;h=fd65b0a1c3f5f981cc110ca9e6a0edb6323e1296
Author: Nikolay Sivov <nsivov at codeweavers.com>
Date: Mon Dec 2 09:38:09 2013 +0400
ntdll: Allow NULL return length argument in NtAdjustPrivilegesToken().
---
dlls/advapi32/security.c | 5 +++--
dlls/advapi32/tests/security.c | 36 ++++++++++++++++++++++++++++++++++++
dlls/ntdll/nt.c | 2 +-
3 files changed, 40 insertions(+), 3 deletions(-)
diff --git a/dlls/advapi32/security.c b/dlls/advapi32/security.c
index 359b1e2..a77bad4 100644
--- a/dlls/advapi32/security.c
+++ b/dlls/advapi32/security.c
@@ -611,8 +611,9 @@ AdjustTokenPrivileges( HANDLE TokenHandle, BOOL DisableAllPrivileges,
{
NTSTATUS status;
- TRACE("\n");
-
+ TRACE("(%p %d %p %d %p %p)\n", TokenHandle, DisableAllPrivileges, NewState, BufferLength,
+ PreviousState, ReturnLength);
+
status = NtAdjustPrivilegesToken(TokenHandle, DisableAllPrivileges,
NewState, BufferLength, PreviousState,
ReturnLength);
diff --git a/dlls/advapi32/tests/security.c b/dlls/advapi32/tests/security.c
index fe31b5c..4de588f 100644
--- a/dlls/advapi32/tests/security.c
+++ b/dlls/advapi32/tests/security.c
@@ -4760,6 +4760,41 @@ static void test_default_dacl_owner_sid(void)
CloseHandle( handle );
}
+static void test_AdjustTokenPrivileges(void)
+{
+ TOKEN_PRIVILEGES tp, prev;
+ HANDLE token;
+ DWORD len;
+ LUID luid;
+ BOOL ret;
+
+ if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &token))
+ return;
+
+ if (!LookupPrivilegeValueA(NULL, SE_BACKUP_NAME, &luid))
+ {
+ CloseHandle(token);
+ return;
+ }
+
+ tp.PrivilegeCount = 1;
+ tp.Privileges[0].Luid = luid;
+ tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
+
+ len = 0xdeadbeef;
+ ret = AdjustTokenPrivileges(token, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, &len);
+ ok(ret, "got %d\n", ret);
+ ok(len == 0xdeadbeef, "got length %d\n", len);
+
+ /* revert */
+ tp.PrivilegeCount = 1;
+ tp.Privileges[0].Luid = luid;
+ tp.Privileges[0].Attributes = 0;
+ AdjustTokenPrivileges(token, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), &prev, NULL);
+
+ CloseHandle(token);
+}
+
START_TEST(security)
{
init();
@@ -4800,4 +4835,5 @@ START_TEST(security)
test_CreateRestrictedToken();
test_TokenIntegrityLevel();
test_default_dacl_owner_sid();
+ test_AdjustTokenPrivileges();
}
diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c
index db8272f..ce648de 100644
--- a/dlls/ntdll/nt.c
+++ b/dlls/ntdll/nt.c
@@ -223,7 +223,7 @@ NTSTATUS WINAPI NtAdjustPrivilegesToken(
ret = wine_server_call( req );
if (PreviousState)
{
- *ReturnLength = reply->len + FIELD_OFFSET( TOKEN_PRIVILEGES, Privileges );
+ if (ReturnLength) *ReturnLength = reply->len + FIELD_OFFSET( TOKEN_PRIVILEGES, Privileges );
PreviousState->PrivilegeCount = reply->len / sizeof(LUID_AND_ATTRIBUTES);
}
}
More information about the wine-cvs
mailing list