s4-schema: fixed the sorting of schema attributes
authorAndrew Tridgell <tridge@samba.org>
Mon, 21 Dec 2009 12:36:23 +0000 (23:36 +1100)
committerAndrew Tridgell <tridge@samba.org>
Mon, 21 Dec 2009 12:45:23 +0000 (23:45 +1100)
another case of unsigned int subtracting breaking sorts. This one
surfaced now as attributeID_id now can be larger than 2^31

source4/dsdb/schema/schema_set.c

index e65e3726237205f5a67fcf105aff06bf813d2c9c..f59fc326962430b675ae6c6f088267756d1dba6e 100644 (file)
@@ -180,13 +180,19 @@ op_error:
        return LDB_ERR_OPERATIONS_ERROR;
 }
 
+static int uint32_cmp(uint32_t c1, uint32_t c2)
+{
+       if (c1 == c2) return 0;
+       return c1 > c2 ? 1 : -1;
+}
+
 static int dsdb_compare_class_by_lDAPDisplayName(struct dsdb_class **c1, struct dsdb_class **c2)
 {
        return strcasecmp((*c1)->lDAPDisplayName, (*c2)->lDAPDisplayName);
 }
 static int dsdb_compare_class_by_governsID_id(struct dsdb_class **c1, struct dsdb_class **c2)
 {
-       return (*c1)->governsID_id - (*c2)->governsID_id;
+       return uint32_cmp((*c1)->governsID_id, (*c2)->governsID_id);
 }
 static int dsdb_compare_class_by_governsID_oid(struct dsdb_class **c1, struct dsdb_class **c2)
 {
@@ -203,7 +209,7 @@ static int dsdb_compare_attribute_by_lDAPDisplayName(struct dsdb_attribute **a1,
 }
 static int dsdb_compare_attribute_by_attributeID_id(struct dsdb_attribute **a1, struct dsdb_attribute **a2)
 {
-       return (*a1)->attributeID_id - (*a2)->attributeID_id;
+       return uint32_cmp((*a1)->attributeID_id, (*a2)->attributeID_id);
 }
 static int dsdb_compare_attribute_by_attributeID_oid(struct dsdb_attribute **a1, struct dsdb_attribute **a2)
 {
@@ -211,7 +217,7 @@ static int dsdb_compare_attribute_by_attributeID_oid(struct dsdb_attribute **a1,
 }
 static int dsdb_compare_attribute_by_linkID(struct dsdb_attribute **a1, struct dsdb_attribute **a2)
 {
-       return (*a1)->linkID - (*a2)->linkID;
+       return uint32_cmp((*a1)->linkID, (*a2)->linkID);
 }
 
 /*