Hans Leidekker : advapi32: Fix buffer size query for CreateWellKnownSid.
Alexandre Julliard
julliard at winehq.org
Thu Apr 16 14:34:46 CDT 2009
Module: wine
Branch: master
Commit: dbe5453f7c3e9d7abdf647fe86587d132a212c3c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=dbe5453f7c3e9d7abdf647fe86587d132a212c3c
Author: Hans Leidekker <hans at codeweavers.com>
Date: Wed Apr 15 14:59:10 2009 +0200
advapi32: Fix buffer size query for CreateWellKnownSid.
---
dlls/advapi32/security.c | 23 ++++++++++++++++++-----
dlls/advapi32/tests/security.c | 23 ++++++++++++++++++++++-
2 files changed, 40 insertions(+), 6 deletions(-)
diff --git a/dlls/advapi32/security.c b/dlls/advapi32/security.c
index f8715e0..65e68ff 100644
--- a/dlls/advapi32/security.c
+++ b/dlls/advapi32/security.c
@@ -859,7 +859,8 @@ CreateWellKnownSid( WELL_KNOWN_SID_TYPE WellKnownSidType,
unsigned int i;
TRACE("(%d, %s, %p, %p)\n", WellKnownSidType, debugstr_sid(DomainSid), pSid, cbSid);
- if (cbSid == NULL || pSid == NULL || (DomainSid && !IsValidSid(DomainSid))) {
+ if (cbSid == NULL || (DomainSid && !IsValidSid(DomainSid)))
+ {
SetLastError(ERROR_INVALID_PARAMETER);
return FALSE;
}
@@ -868,11 +869,17 @@ CreateWellKnownSid( WELL_KNOWN_SID_TYPE WellKnownSidType,
if (WellKnownSids[i].Type == WellKnownSidType) {
DWORD length = GetSidLengthRequired(WellKnownSids[i].Sid.SubAuthorityCount);
- if (*cbSid < length) {
+ if (*cbSid < length)
+ {
+ *cbSid = length;
SetLastError(ERROR_INSUFFICIENT_BUFFER);
return FALSE;
}
-
+ if (!pSid)
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
CopyMemory(pSid, &WellKnownSids[i].Sid.Revision, length);
*cbSid = length;
return TRUE;
@@ -891,11 +898,17 @@ CreateWellKnownSid( WELL_KNOWN_SID_TYPE WellKnownSidType,
DWORD domain_sid_length = GetSidLengthRequired(domain_subauth);
DWORD output_sid_length = GetSidLengthRequired(domain_subauth + 1);
- if (*cbSid < output_sid_length) {
+ if (*cbSid < output_sid_length)
+ {
+ *cbSid = output_sid_length;
SetLastError(ERROR_INSUFFICIENT_BUFFER);
return FALSE;
}
-
+ if (!pSid)
+ {
+ SetLastError(ERROR_INVALID_PARAMETER);
+ return FALSE;
+ }
CopyMemory(pSid, DomainSid, domain_sid_length);
(*GetSidSubAuthorityCount(pSid))++;
(*GetSidSubAuthority(pSid, domain_subauth)) = WellKnownRids[i].Rid;
diff --git a/dlls/advapi32/tests/security.c b/dlls/advapi32/tests/security.c
index ac848bb..f775d10 100644
--- a/dlls/advapi32/tests/security.c
+++ b/dlls/advapi32/tests/security.c
@@ -1354,7 +1354,9 @@ struct well_known_sid_value
static void test_CreateWellKnownSid(void)
{
SID_IDENTIFIER_AUTHORITY ident = { SECURITY_NT_AUTHORITY };
- PSID domainsid;
+ PSID domainsid, sid;
+ DWORD size, error;
+ BOOL ret;
int i;
if (!pCreateWellKnownSid)
@@ -1363,6 +1365,25 @@ static void test_CreateWellKnownSid(void)
return;
}
+ size = 0;
+ SetLastError(0xdeadbeef);
+ ret = pCreateWellKnownSid(WinInteractiveSid, NULL, NULL, &size);
+ error = GetLastError();
+ ok(!ret, "CreateWellKnownSid succeeded\n");
+ ok(error == ERROR_INSUFFICIENT_BUFFER, "expected ERROR_INSUFFICIENT_BUFFER, got %u\n", error);
+ ok(size, "expected size > 0\n");
+
+ SetLastError(0xdeadbeef);
+ ret = pCreateWellKnownSid(WinInteractiveSid, NULL, NULL, &size);
+ error = GetLastError();
+ ok(!ret, "CreateWellKnownSid succeeded\n");
+ ok(error == ERROR_INVALID_PARAMETER, "expected ERROR_INVALID_PARAMETER, got %u\n", error);
+
+ sid = HeapAlloc(GetProcessHeap(), 0, size);
+ ret = pCreateWellKnownSid(WinInteractiveSid, NULL, sid, &size);
+ ok(ret, "CreateWellKnownSid failed %u\n", GetLastError());
+ HeapFree(GetProcessHeap(), 0, sid);
+
/* a domain sid usually have three subauthorities but we test that CreateWellKnownSid doesn't check it */
AllocateAndInitializeSid(&ident, 6, SECURITY_NT_NON_UNIQUE, 12, 23, 34, 45, 56, 0, 0, &domainsid);
More information about the wine-cvs
mailing list