libcli:security: sddl_map_flags rejects trailing nonsense
authorDouglas Bagnall <douglas.bagnall@catalyst.net.nz>
Fri, 21 Apr 2023 03:47:10 +0000 (15:47 +1200)
committerAndrew Bartlett <abartlet@samba.org>
Fri, 28 Apr 2023 02:15:36 +0000 (02:15 +0000)
Signed-off-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
libcli/security/sddl.c
selftest/knownfail.d/sddl

index cfd625da6baf5b38f0b7c6f1d2a04c37bb3d645f..b115d893e72111a9bb76fc81f6154c3d2bb24048 100644 (file)
@@ -69,18 +69,14 @@ static bool sddl_map_flags(const struct flag_map *map, const char *str,
                *plen = 0;
        }
        *pflags = 0;
-       while (str[0] && isupper(str[0])) {
+       while (str[0] != '\0' && isupper((unsigned char)str[0])) {
                size_t len;
                uint32_t flags;
                bool found;
 
                found = sddl_map_flag(map, str, &len, &flags);
                if (!found) {
-                        if (unknown_flag_is_part_of_next_thing) {
-                                return true;
-                        }
-                       DEBUG(1, ("Unknown flag - %s in %s\n", str, str0));
-                       return false;
+                       break;
                }
 
                *pflags |= flags;
@@ -89,7 +85,19 @@ static bool sddl_map_flags(const struct flag_map *map, const char *str,
                }
                str += len;
        }
-       return true;
+       /*
+        * For ACL flags, unknown_flag_is_part_of_next_thing is set,
+        * and we expect some more stuff that isn't flags.
+        *
+         * For ACE flags, unknown_flag_is_part_of_next_thing is unset,
+         * and the flags have been tokenised into their own little
+         * string. We don't expect anything here, even whitespace.
+         */
+        if (*str == '\0' || unknown_flag_is_part_of_next_thing) {
+                return true;
+        }
+       DBG_WARNING("Unknown flag - '%s' in '%s'\n", str, str0);
+        return false;
 }
 
 
index e50cbad2c8d0287ebb2f9956cf43787eb6798bb5..30fa1f85275963d88a36407f39aec7a613f71569 100644 (file)
@@ -7,7 +7,6 @@
 ^samba.tests.sddl.+.SddlWindowsFlagsAreDifferent.test_sddl_D:.A;;0x001f01ff;;;WD..A;;0x001f01ff;;;S-1.+S
 ^samba.tests.sddl.+.SddlWindowsFlagsAreDifferent.test_sddl_D:.A;;FA;;;WD..none
 ^samba.tests.sddl.+.SddlWindowsFlagsAreDifferent.test_sddl_O:S-1-5-21-2212615479-2695158682-210137546.+:
-^samba.tests.sddl.+.SddlWindowsIsLessFussy.test_sddl_should_fail_D:.A;.;GA;;;LG..none
 ^samba.tests.sddl.+.SddlWindowsIsLessFussy.test_sddl_should_fail_D:.A;;.GA;;;LG..none
 ^samba.tests.sddl.+.SddlWindowsIsLessFussy.test_sddl_should_fail_D:.A;;GA;;;WD...none
 ^samba.tests.sddl.+.SddlWindowsIsLessFussy.test_sddl_should_fail_D:.A;;ga;;;LG..none