Module: wine Branch: master Commit: bb3d74c2e1e65b77686d7fab7762de3d9c635e43 URL: https://source.winehq.org/git/wine.git/?a=commit;h=bb3d74c2e1e65b77686d7fab7...
Author: Zebediah Figura zfigura@codeweavers.com Date: Tue May 11 16:51:37 2021 -0500
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
---
dlls/advapi32/tests/security.c | 4 ++++ dlls/sechost/security.c | 36 ++++++++++++------------------------ 2 files changed, 16 insertions(+), 24 deletions(-)
diff --git a/dlls/advapi32/tests/security.c b/dlls/advapi32/tests/security.c index 299a340dcf3..b3361795761 100644 --- a/dlls/advapi32/tests/security.c +++ b/dlls/advapi32/tests/security.c @@ -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 */ diff --git a/dlls/sechost/security.c b/dlls/sechost/security.c index 47ffba9ed52..b6731b1fe1c 100644 --- a/dlls/sechost/security.c +++ b/dlls/sechost/security.c @@ -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') - { - 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 != ';') { - 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;