summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2009-12-20 10:25:46 +1100
committerAndrew Tridgell <tridge@samba.org>2009-12-21 23:41:07 +1100
commita106fefcfb0cb60ce439884d8cd0c920d2fb193a (patch)
treefa5ac7f77c41b97733f885004cf877ca370b4d3c
parent2a4a159a8443ebaae53f5902a0f5c1f8536a6edd (diff)
downloadsamba-a106fefcfb0cb60ce439884d8cd0c920d2fb193a.tar.gz
samba-a106fefcfb0cb60ce439884d8cd0c920d2fb193a.tar.bz2
samba-a106fefcfb0cb60ce439884d8cd0c920d2fb193a.zip
librpc: fixed the GUID_compare() function
When comparing two unsigned values you can't just subtract them. Imagine you are comparing: "uint32_t u1" and "uint32_t u2". If you use "u1 - u2" and u2 is zero, then the signed integer result will depend on the top bit of u1. This error occurs in a few places in Samba. For DRS replication it resulted in corrupt uptodateness vectors.
-rw-r--r--librpc/ndr/uuid.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/librpc/ndr/uuid.c b/librpc/ndr/uuid.c
index 429a1b1ac9..1899afbbca 100644
--- a/librpc/ndr/uuid.c
+++ b/librpc/ndr/uuid.c
@@ -241,23 +241,23 @@ _PUBLIC_ bool GUID_equal(const struct GUID *u1, const struct GUID *u2)
_PUBLIC_ int GUID_compare(const struct GUID *u1, const struct GUID *u2)
{
if (u1->time_low != u2->time_low) {
- return u1->time_low - u2->time_low;
+ return u1->time_low > u2->time_low ? 1 : -1;
}
if (u1->time_mid != u2->time_mid) {
- return u1->time_mid - u2->time_mid;
+ return u1->time_mid > u2->time_mid ? 1 : -1;
}
if (u1->time_hi_and_version != u2->time_hi_and_version) {
- return u1->time_hi_and_version - u2->time_hi_and_version;
+ return u1->time_hi_and_version > u2->time_hi_and_version ? 1 : -1;
}
if (u1->clock_seq[0] != u2->clock_seq[0]) {
- return u1->clock_seq[0] - u2->clock_seq[0];
+ return u1->clock_seq[0] > u2->clock_seq[0] ? 1 : -1;
}
if (u1->clock_seq[1] != u2->clock_seq[1]) {
- return u1->clock_seq[1] - u2->clock_seq[1];
+ return u1->clock_seq[1] > u2->clock_seq[1] ? 1 : -1;
}
return memcmp(u1->node, u2->node, 6);