]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
libcli/security: use NUMERIC_CMP in dom_sid_compare()
authorDouglas Bagnall <douglas.bagnall@catalyst.net.nz>
Thu, 4 Apr 2024 00:43:47 +0000 (13:43 +1300)
committerJule Anger <janger@samba.org>
Mon, 10 Jun 2024 13:25:17 +0000 (13:25 +0000)
sid->num_auths is always small (int8 < 16), so this is cosmetic only.

BUG: https://bugzilla.samba.org/show_bug.cgi?id=15625

Signed-off-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
Reviewed-by: Andrew Bartlett <abartlet@samba.org>
(backported from commit cb94202c1cf990e871ee2e8e43c577a0e4b9ee6f)
[dbagnall@samba.org: file changed in master]

libcli/security/dom_sid.c

index 9a91760ff6246d20f14a34da29b17ec3d7189357..38f98f9f906b0ec3b5eff812bcedd8427e729593 100644 (file)
@@ -28,6 +28,7 @@
 #include "librpc/gen_ndr/security.h"
 #include "dom_sid.h"
 #include "lib/util/smb_strtox.h"
+#include "lib/util/tsort.h"
 
 /*****************************************************************
  Compare the auth portion of two sids.
@@ -71,12 +72,17 @@ int dom_sid_compare(const struct dom_sid *sid1, const struct dom_sid *sid2)
                return 1;
 
        /* Compare most likely different rids, first: i.e start at end */
-       if (sid1->num_auths != sid2->num_auths)
-               return sid1->num_auths - sid2->num_auths;
-
-       for (i = sid1->num_auths-1; i >= 0; --i)
-               if (sid1->sub_auths[i] != sid2->sub_auths[i])
-                       return sid1->sub_auths[i] - sid2->sub_auths[i];
+       if (sid1->num_auths != sid2->num_auths) {
+               return NUMERIC_CMP(sid1->num_auths, sid2->num_auths);
+       }
+       for (i = sid1->num_auths-1; i >= 0; --i) {
+               if (sid1->sub_auths[i] < sid2->sub_auths[i]) {
+                       return -1;
+               }
+               if (sid1->sub_auths[i] > sid2->sub_auths[i]) {
+                       return 1;
+               }
+       }
 
        return dom_sid_compare_auth(sid1, sid2);
 }