sechost: Implement hexadecimal SID parsing.

Signed-off-by: Esme Povirk <esme@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Esme Povirk 2021-06-17 14:40:41 -05:00 committed by Alexandre Julliard
parent c50dab4828
commit 66a91fe683
2 changed files with 38 additions and 22 deletions

View File

@ -306,6 +306,7 @@ static void test_ConvertStringSidToSid(void)
{ "RS", "", 1 },
{ "SA", "", 1 },
{ "s-1-12-1", "S-1-12-1" },
{ "S-0x1-0XC-0x1a", "S-1-12-26" },
};
const char noSubAuthStr[] = "S-1-5";

View File

@ -594,18 +594,42 @@ static BOOL get_computer_sid( PSID sid )
return TRUE;
}
static BOOL parse_token( const WCHAR *string, const WCHAR **end, DWORD *result )
{
if (string[0] == '0' && (string[1] == 'X' || string[1] == 'x'))
{
/* hexadecimal */
*result = wcstoul( string + 2, (WCHAR**)&string, 16 );
if (*string == '-')
string++;
*end = string;
return TRUE;
}
else if (iswdigit(string[0]) || string[0] == '-')
{
*result = wcstoul( string, (WCHAR**)&string, 10 );
if (*string == '-')
string++;
*end = string;
return TRUE;
}
*result = 0;
*end = string;
return FALSE;
}
static DWORD get_sid_size( const WCHAR *string, const WCHAR **end )
{
if ((string[0] == 'S' || string[0] == 's') && string[1] == '-') /* S-R-I(-S)+ */
{
int token_count = 0;
string++;
while (*string == '-' || iswdigit(*string))
{
if (*string == '-')
token_count++;
string++;
}
DWORD value;
string += 2;
while (parse_token( string, &string, &value ))
token_count++;
if (end)
*end = string;
@ -653,9 +677,11 @@ static BOOL parse_sid( const WCHAR *string, const WCHAR **end, SID *pisid, DWORD
{
DWORD i = 0, identAuth;
DWORD csubauth = ((*size - GetSidLengthRequired(0)) / sizeof(DWORD));
DWORD token;
string += 2; /* Advance to Revision */
pisid->Revision = wcstoul( string, (WCHAR**)&string, 10 );
parse_token( string, &string, &token );
pisid->Revision = token;
if (pisid->Revision != SDDL_REVISION)
{
@ -672,31 +698,20 @@ static BOOL parse_sid( const WCHAR *string, const WCHAR **end, SID *pisid, DWORD
pisid->SubAuthorityCount = csubauth;
/* Advance to identifier authority */
if (*string == '-')
string++;
/* MS' implementation can't handle values greater than 2^32 - 1, so
* we don't either; assume most significant bytes are always 0
*/
pisid->IdentifierAuthority.Value[0] = 0;
pisid->IdentifierAuthority.Value[1] = 0;
identAuth = wcstoul( string, (WCHAR**)&string, 10 );
parse_token( string, &string, &identAuth );
pisid->IdentifierAuthority.Value[5] = identAuth & 0xff;
pisid->IdentifierAuthority.Value[4] = (identAuth & 0xff00) >> 8;
pisid->IdentifierAuthority.Value[3] = (identAuth & 0xff0000) >> 16;
pisid->IdentifierAuthority.Value[2] = (identAuth & 0xff000000) >> 24;
/* Advance to first sub authority */
if (*string == '-')
string++;
while (iswdigit(*string) || *string == '-')
while (parse_token( string, &string, &token ))
{
pisid->SubAuthority[i++] = wcstoul( string, (WCHAR**)&string, 10 );
if (*string == '-')
string++;
pisid->SubAuthority[i++] = token;
}
if (i != pisid->SubAuthorityCount)