mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2024-11-21 16:46:54 -08:00
75 lines
3.2 KiB
Diff
75 lines
3.2 KiB
Diff
From 81bd9eaa0466b7adc763d4302ca70141f8aa3947 Mon Sep 17 00:00:00 2001
|
|
From: Qian Hong <qhong@codeweavers.com>
|
|
Date: Tue, 16 Feb 2016 04:53:12 +0800
|
|
Subject: [PATCH] ntdll: Improve invalid paramater handling in NtAccessCheck.
|
|
|
|
Signed-off-by: Qian Hong <qhong@codeweavers.com>
|
|
---
|
|
dlls/advapi32/tests/security.c | 8 --------
|
|
dlls/ntdll/unix/security.c | 8 +++++++-
|
|
2 files changed, 7 insertions(+), 9 deletions(-)
|
|
|
|
diff --git a/dlls/advapi32/tests/security.c b/dlls/advapi32/tests/security.c
|
|
index 825f8451904..ca6e735c1c6 100644
|
|
--- a/dlls/advapi32/tests/security.c
|
|
+++ b/dlls/advapi32/tests/security.c
|
|
@@ -1466,10 +1466,8 @@ static void test_AccessCheck(void)
|
|
ret = AccessCheck(SecurityDescriptor, Token, KEY_READ, &Mapping,
|
|
0, &PrivSetLen, &Access, &AccessStatus);
|
|
err = GetLastError();
|
|
-todo_wine
|
|
ok(!ret && err == ERROR_INSUFFICIENT_BUFFER, "AccessCheck should have "
|
|
"failed with ERROR_INSUFFICIENT_BUFFER, instead of %d\n", err);
|
|
-todo_wine
|
|
ok(PrivSetLen == sizeof(PRIVILEGE_SET), "PrivSetLen returns %d\n", PrivSetLen);
|
|
ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed,
|
|
"Access and/or AccessStatus were changed!\n");
|
|
@@ -1520,12 +1518,9 @@ todo_wine
|
|
ret = AccessCheck(SecurityDescriptor, Token, KEY_READ, &Mapping,
|
|
PrivSet, &PrivSetLen, &Access, &AccessStatus);
|
|
err = GetLastError();
|
|
-todo_wine
|
|
ok(!ret && err == ERROR_INSUFFICIENT_BUFFER, "AccessCheck should have "
|
|
"failed with ERROR_INSUFFICIENT_BUFFER, instead of %d\n", err);
|
|
-todo_wine
|
|
ok(PrivSetLen == sizeof(PRIVILEGE_SET), "PrivSetLen returns %d\n", PrivSetLen);
|
|
-todo_wine
|
|
ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed,
|
|
"Access and/or AccessStatus were changed!\n");
|
|
|
|
@@ -1637,12 +1632,9 @@ todo_wine
|
|
ret = AccessCheck(SecurityDescriptor, Token, KEY_READ, &Mapping,
|
|
PrivSet, &PrivSetLen, &Access, &AccessStatus);
|
|
err = GetLastError();
|
|
- todo_wine
|
|
ok(!ret && err == ERROR_INSUFFICIENT_BUFFER, "AccessCheck should have "
|
|
"failed with ERROR_INSUFFICIENT_BUFFER, instead of %d\n", err);
|
|
- todo_wine
|
|
ok(PrivSetLen == sizeof(PRIVILEGE_SET), "PrivSetLen returns %d\n", PrivSetLen);
|
|
- todo_wine
|
|
ok(Access == 0x1abe11ed && AccessStatus == 0x1abe11ed,
|
|
"Access and/or AccessStatus were changed!\n");
|
|
|
|
diff --git a/dlls/ntdll/unix/security.c b/dlls/ntdll/unix/security.c
|
|
index daecc5e0591..c1237859784 100644
|
|
--- a/dlls/ntdll/unix/security.c
|
|
+++ b/dlls/ntdll/unix/security.c
|
|
@@ -650,7 +650,13 @@ NTSTATUS WINAPI NtAccessCheck( PSECURITY_DESCRIPTOR descr, HANDLE token, ACCESS_
|
|
TRACE( "(%p, %p, %08x, %p, %p, %p, %p, %p)\n",
|
|
descr, token, access, mapping, privs, retlen, access_granted, access_status );
|
|
|
|
- if (!privs || !retlen) return STATUS_ACCESS_VIOLATION;
|
|
+ if (!retlen) return STATUS_ACCESS_VIOLATION;
|
|
+ if (!*retlen)
|
|
+ {
|
|
+ *retlen = sizeof(PRIVILEGE_SET);
|
|
+ return STATUS_BUFFER_TOO_SMALL;
|
|
+ }
|
|
+ if (!privs) return STATUS_ACCESS_VIOLATION;
|
|
|
|
/* reuse the object attribute SD marshalling */
|
|
InitializeObjectAttributes( &attr, NULL, 0, 0, descr );
|
|
--
|
|
2.27.0
|
|
|