From cb52c27133f0cfd268692e796ac2d4466642ea9c Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Tue, 1 Jan 2013 22:04:41 +0000 Subject: [PATCH] [SAMSRV] SamrGetAliasMembership: - Change requrred access right from DOMIN_LOOKUP to DOMAIN_GET_ALIAS_MEMBERSHIP. - Handle the case properly where a user is not a member of any alias. - Retrieve an alias members RID correctly. svn path=/trunk/; revision=58094 --- reactos/dll/win32/samsrv/samrpc.c | 37 +++++++++++++++++++++++-------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/reactos/dll/win32/samsrv/samrpc.c b/reactos/dll/win32/samsrv/samrpc.c index 184b2977c0e..ebc6020faad 100644 --- a/reactos/dll/win32/samsrv/samrpc.c +++ b/reactos/dll/win32/samsrv/samrpc.c @@ -2877,6 +2877,7 @@ SamrGetAliasMembership(IN SAMPR_HANDLE DomainHandle, ULONG DataLength; ULONG i, j; NTSTATUS Status; + WCHAR NameBuffer[9]; TRACE("SamrGetAliasMembership(%p %p %p)\n", DomainHandle, SidArray, Membership); @@ -2884,7 +2885,7 @@ SamrGetAliasMembership(IN SAMPR_HANDLE DomainHandle, /* Validate the domain handle */ Status = SampValidateDbObject(DomainHandle, SamDbDomainObject, - DOMAIN_LOOKUP, + DOMAIN_GET_ALIAS_MEMBERSHIP, &DomainObject); if (!NT_SUCCESS(Status)) return Status; @@ -2902,6 +2903,13 @@ SamrGetAliasMembership(IN SAMPR_HANDLE DomainHandle, KEY_READ, &MembersKeyHandle); TRACE("SampRegOpenKey returned %08lX\n", Status); + + if (Status == STATUS_OBJECT_NAME_NOT_FOUND) + { + Status = STATUS_SUCCESS; + goto done; + } + if (!NT_SUCCESS(Status)) goto done; @@ -2926,13 +2934,21 @@ TRACE("Open %S\n", MemberSidString); MaxSidCount += ValueCount; } - NtClose(MemberKeyHandle); } + if (Status == STATUS_OBJECT_NAME_NOT_FOUND) + Status = STATUS_SUCCESS; + LocalFree(MemberSidString); } + if (MaxSidCount == 0) + { + Status = STATUS_SUCCESS; + goto done; + } + TRACE("Maximum sid count: %lu\n", MaxSidCount); RidArray = midl_user_allocate(MaxSidCount * sizeof(ULONG)); if (RidArray == NULL) @@ -2962,14 +2978,18 @@ TRACE("Open %S\n", MemberSidString); for (j = 0; j < ValueCount; j++) { - DataLength = sizeof(ULONG); + DataLength = 9 * sizeof(WCHAR); Status = SampRegEnumerateValue(MemberKeyHandle, j, - NULL, - NULL, - NULL, - (PVOID)&RidArray[j], - &DataLength); + NameBuffer, + &DataLength, + NULL, + NULL, + NULL); + if (NT_SUCCESS(Status)) + { + RidArray[j] = wcstoul(NameBuffer, NULL, 16); + } } } @@ -2979,7 +2999,6 @@ TRACE("Open %S\n", MemberSidString); LocalFree(MemberSidString); } - done: if (NT_SUCCESS(Status)) {