dll: posix: FspNullSid, FspNullUid

This commit is contained in:
Bill Zissimopoulos 2016-06-23 23:42:37 -07:00
parent a3cfc84007
commit 3683afe203

View File

@ -36,8 +36,23 @@
static PISID FspPosixCreateSid(BYTE Authority, ULONG Count, ...); static PISID FspPosixCreateSid(BYTE Authority, ULONG Count, ...);
static INIT_ONCE FspPosixInitOnce = INIT_ONCE_STATIC_INIT; static INIT_ONCE FspPosixInitOnce = INIT_ONCE_STATIC_INIT;
union
{
SID V;
UINT8 B[sizeof(SID) - sizeof(DWORD) + (1 * sizeof(DWORD))];
} FspNullSidBuf =
{
/* S-1-0-0 */
.V.Revision = SID_REVISION,
.V.SubAuthorityCount = 1,
.V.IdentifierAuthority.Value[5] = 0,
.V.SubAuthority[0] = 0,
};
static PISID FspAccountDomainSid, FspPrimaryDomainSid; static PISID FspAccountDomainSid, FspPrimaryDomainSid;
#define FspNullSid (&FspNullSidBuf.V)
#define FspNullUid -1
static BOOL WINAPI FspPosixInitialize( static BOOL WINAPI FspPosixInitialize(
PINIT_ONCE InitOnce, PVOID Parameter, PVOID *Context) PINIT_ONCE InitOnce, PVOID Parameter, PVOID *Context)
{ {
@ -104,6 +119,8 @@ VOID FspPosixFinalize(BOOLEAN Dynamic)
FSP_API NTSTATUS FspPosixMapUidToSid(UINT32 Uid, PSID *PSid) FSP_API NTSTATUS FspPosixMapUidToSid(UINT32 Uid, PSID *PSid)
{ {
InitOnceExecuteOnce(&FspPosixInitOnce, FspPosixInitialize, 0, 0);
*PSid = 0; *PSid = 0;
/* /*
@ -157,8 +174,6 @@ FSP_API NTSTATUS FspPosixMapUidToSid(UINT32 Uid, PSID *PSid)
*/ */
else if (0x30000 <= Uid && Uid < 0x40000) else if (0x30000 <= Uid && Uid < 0x40000)
{ {
InitOnceExecuteOnce(&FspPosixInitOnce, FspPosixInitialize, 0, 0);
if (0 != FspAccountDomainSid && if (0 != FspAccountDomainSid &&
5 == FspAccountDomainSid->IdentifierAuthority.Value[5] && 5 == FspAccountDomainSid->IdentifierAuthority.Value[5] &&
4 == FspAccountDomainSid->SubAuthorityCount) 4 == FspAccountDomainSid->SubAuthorityCount)
@ -173,8 +188,6 @@ FSP_API NTSTATUS FspPosixMapUidToSid(UINT32 Uid, PSID *PSid)
} }
else if (0x100000 <= Uid && Uid < 0x200000) else if (0x100000 <= Uid && Uid < 0x200000)
{ {
InitOnceExecuteOnce(&FspPosixInitOnce, FspPosixInitialize, 0, 0);
if (0 != FspPrimaryDomainSid && if (0 != FspPrimaryDomainSid &&
5 == FspPrimaryDomainSid->IdentifierAuthority.Value[5] && 5 == FspPrimaryDomainSid->IdentifierAuthority.Value[5] &&
4 == FspPrimaryDomainSid->SubAuthorityCount) 4 == FspPrimaryDomainSid->SubAuthorityCount)
@ -214,13 +227,15 @@ FSP_API NTSTATUS FspPosixMapUidToSid(UINT32 Uid, PSID *PSid)
*PSid = FspPosixCreateSid(5, 2, Uid >> 12, Uid & 0xfff); *PSid = FspPosixCreateSid(5, 2, Uid >> 12, Uid & 0xfff);
if (0 == *PSid) if (0 == *PSid)
return STATUS_NONE_MAPPED; *PSid = FspNullSid;
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
FSP_API NTSTATUS FspPosixMapSidToUid(PSID Sid, PUINT32 PUid) FSP_API NTSTATUS FspPosixMapSidToUid(PSID Sid, PUINT32 PUid)
{ {
InitOnceExecuteOnce(&FspPosixInitOnce, FspPosixInitialize, 0, 0);
BYTE Authority; BYTE Authority;
BYTE Count; BYTE Count;
UINT32 SubAuthority0, Rid; UINT32 SubAuthority0, Rid;
@ -274,8 +289,6 @@ FSP_API NTSTATUS FspPosixMapSidToUid(PSID Sid, PUINT32 PUid)
*/ */
else if (5 <= Count && 21 == SubAuthority0) else if (5 <= Count && 21 == SubAuthority0)
{ {
InitOnceExecuteOnce(&FspPosixInitOnce, FspPosixInitialize, 0, 0);
/* /*
* The order is important! A server that is also a domain controller * The order is important! A server that is also a domain controller
* has PrimaryDomainSid == AccountDomainSid. * has PrimaryDomainSid == AccountDomainSid.
@ -322,7 +335,7 @@ FSP_API NTSTATUS FspPosixMapSidToUid(PSID Sid, PUINT32 PUid)
} }
if (-1 == *PUid) if (-1 == *PUid)
return STATUS_NONE_MAPPED; *PUid = FspNullUid;
return STATUS_SUCCESS; return STATUS_SUCCESS;
} }
@ -351,7 +364,9 @@ static PISID FspPosixCreateSid(BYTE Authority, ULONG Count, ...)
FSP_API VOID FspDeleteSid(PSID Sid, NTSTATUS (*CreateFunc)()) FSP_API VOID FspDeleteSid(PSID Sid, NTSTATUS (*CreateFunc)())
{ {
if ((NTSTATUS (*)())FspPosixMapUidToSid == CreateFunc) if (FspNullSid == Sid)
;
else if ((NTSTATUS (*)())FspPosixMapUidToSid == CreateFunc)
MemFree(Sid); MemFree(Sid);
} }