SELinux: deterministic ordering of range transition rules
authorEric Paris <eparis@redhat.com>
Wed, 13 Oct 2010 21:50:14 +0000 (17:50 -0400)
committerJames Morris <jmorris@namei.org>
Wed, 20 Oct 2010 23:12:56 +0000 (10:12 +1100)
Range transition rules are placed in the hash table in an (almost)
arbitrary order.  This patch inserts them in a fixed order to make policy
retrival more predictable.

Signed-off-by: Eric Paris <eparis@redhat.com>
Signed-off-by: James Morris <jmorris@namei.org>
security/selinux/ss/policydb.c

index aa5a2fd1cc09e83305817e036d3334b7edb4a665..97fb0cf0eb6955f5b68a0e57a8791ad819d126ca 100644 (file)
@@ -185,9 +185,19 @@ static u32 rangetr_hash(struct hashtab *h, const void *k)
 static int rangetr_cmp(struct hashtab *h, const void *k1, const void *k2)
 {
        const struct range_trans *key1 = k1, *key2 = k2;
-       return (key1->source_type != key2->source_type ||
-               key1->target_type != key2->target_type ||
-               key1->target_class != key2->target_class);
+       int v;
+
+       v = key1->source_type - key2->source_type;
+       if (v)
+               return v;
+
+       v = key1->target_type - key2->target_type;
+       if (v)
+               return v;
+
+       v = key1->target_class - key2->target_class;
+
+       return v;
 }
 
 /*