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

Alexandre Julliard julliard at winehq.org
Wed May 12 15:44:28 CDT 2021


Module: wine
Branch: master
Commit: bb3d74c2e1e65b77686d7fab7762de3d9c635e43
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=bb3d74c2e1e65b77686d7fab7762de3d9c635e43

Author: Zebediah Figura <zfigura at 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 at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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;




More information about the wine-cvs mailing list