Skip to content

Commit

Permalink
dsdb: Ensure to sort replPropertyMetaData as UNSIGNED, not SIGNED qua…
Browse files Browse the repository at this point in the history
…ntities

enum is an int, and therefore signed.  Some attributes have the high bit set.

Andrew Bartlett

Change-Id: I39a5499b7c6bbb763e15977d802cda8c69b94618
Signed-off-by: Andrew Bartlett <abartlet@samba.org>
Reviewed-on: https://gerrit.samba.org/163
Reviewed-by: Kamen Mazdrashki <kamenim@samba.org>

Autobuild-User(master): Andrew Bartlett <abartlet@samba.org>
Autobuild-Date(master): Fri Mar 14 10:16:41 CET 2014 on sn-devel-104
  • Loading branch information
abartlet committed Mar 14, 2014
1 parent 83fbdc8 commit 61b9788
Showing 1 changed file with 18 additions and 4 deletions.
22 changes: 18 additions & 4 deletions source4/dsdb/samdb/ldb_modules/repl_meta_data.c
Original file line number Diff line number Diff line change
Expand Up @@ -660,7 +660,15 @@ static int replmd_replPropertyMetaData1_attid_sort(const struct replPropertyMeta
const struct replPropertyMetaData1 *m2,
const uint32_t *rdn_attid)
{
if (m1->attid == m2->attid) {
/*
* This assignment seems inoccous, but it is critical for the
* system, as we need to do the comparisons as a unsigned
* quantity, not signed (enums are signed integers)
*/
uint32_t attid_1 = m1->attid;
uint32_t attid_2 = m2->attid;

if (attid_1 == attid_2) {
return 0;
}

Expand All @@ -669,7 +677,7 @@ static int replmd_replPropertyMetaData1_attid_sort(const struct replPropertyMeta
* so we need to return a value greater than zero
* which means m1 is greater than m2
*/
if (m1->attid == *rdn_attid) {
if (attid_1 == *rdn_attid) {
return 1;
}

Expand All @@ -678,11 +686,17 @@ static int replmd_replPropertyMetaData1_attid_sort(const struct replPropertyMeta
* so we need to return a value less than zero
* which means m2 is greater than m1
*/
if (m2->attid == *rdn_attid) {
if (attid_2 == *rdn_attid) {
return -1;
}

return m1->attid > m2->attid ? 1 : -1;
/*
* See above regarding this being an unsigned comparison.
* Otherwise when the high bit is set on non-standard
* attributes, they would end up first, before objectClass
* (0).
*/
return attid_1 > attid_2 ? 1 : -1;
}

static int replmd_replPropertyMetaDataCtr1_sort(struct replPropertyMetaDataCtr1 *ctr1,
Expand Down

0 comments on commit 61b9788

Please sign in to comment.