sechost: Allow hexadecimal and string rights flags to be interleaved.

Signed-off-by: Zebediah Figura <zfigura@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Zebediah Figura 2021-05-11 16:51:37 -05:00 committed by Alexandre Julliard
parent c74508d225
commit bb3d74c2e1
2 changed files with 16 additions and 24 deletions

View File

@ -4212,6 +4212,10 @@ static void test_ConvertStringSecurityDescriptor(void)
{ "D:(A;;KAKRKWKX;;;WD)", SDDL_REVISION_1, TRUE },
{ "D:(A;;0xFFFFFFFF;;;WD)", SDDL_REVISION_1, TRUE },
{ "S:(AU;;0xFFFFFFFF;;;WD)", SDDL_REVISION_1, TRUE },
{ "S:(AU;;0xDeAdBeEf;;;WD)", SDDL_REVISION_1, TRUE },
{ "S:(AU;;GR0xFFFFFFFF;;;WD)", SDDL_REVISION_1, TRUE },
{ "S:(AU;;0xFFFFFFFFGR;;;WD)", SDDL_REVISION_1, TRUE },
{ "S:(AU;;0xFFFFFGR;;;WD)", SDDL_REVISION_1, TRUE },
/* test ACE string access right error case */
{ "D:(A;;ROB;;;WD)", SDDL_REVISION_1, FALSE, ERROR_INVALID_ACL },
/* test behaviour with empty strings */

View File

@ -868,14 +868,21 @@ static DWORD parse_ace_flag( const WCHAR *string )
return 0;
}
static DWORD parse_ace_right( const WCHAR *string )
static DWORD parse_ace_right( const WCHAR **string_ptr )
{
const WCHAR *string = *string_ptr;
unsigned int i;
if (string[0] == '0' && string[1] == 'x')
return wcstoul( string, (WCHAR **)string_ptr, 16 );
for (i = 0; i < ARRAY_SIZE(ace_rights); ++i)
{
if (!wcsncmp( string, ace_rights[i].str, 2 ))
{
*string_ptr += 2;
return ace_rights[i].value;
}
}
return 0;
}
@ -908,30 +915,11 @@ static DWORD parse_ace_rights( const WCHAR **string_ptr )
while (*string == ' ')
string++;
if (string[0] == '0' && string[1] == 'x')
while (*string != ';')
{
const WCHAR *p = string;
while (*p && *p != ';')
p++;
if (p - string <= 10 /* 8 hex digits + "0x" */ )
{
rights = wcstoul( string, NULL, 16 );
string = p;
}
else
WARN("Invalid rights string format: %s\n", debugstr_wn(string, p - string));
}
else
{
while (*string != ';')
{
DWORD right = parse_ace_right( string );
if (!right) return 0;
rights |= right;
string += 2;
}
DWORD right = parse_ace_right( &string );
if (!right) return 0;
rights |= right;
}
*string_ptr = string;