mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-12-20 22:59:34 -05:00
Fix memn(r)cmp of key sizes > INT_MAX. Simplify.
This commit is contained in:
parent
69e53cf700
commit
2d1f3b7ed3
1 changed files with 20 additions and 21 deletions
|
|
@ -2340,45 +2340,44 @@ cintcmp(const MDB_val *a, const MDB_val *b)
|
||||||
static int
|
static int
|
||||||
memncmp(const MDB_val *a, const MDB_val *b)
|
memncmp(const MDB_val *a, const MDB_val *b)
|
||||||
{
|
{
|
||||||
int diff, len_diff;
|
int diff;
|
||||||
|
ssize_t len_diff;
|
||||||
unsigned int len;
|
unsigned int len;
|
||||||
|
|
||||||
len = a->mv_size;
|
len = a->mv_size;
|
||||||
len_diff = a->mv_size - b->mv_size;
|
len_diff = (ssize_t) a->mv_size - (ssize_t) b->mv_size;
|
||||||
if (len_diff > 0)
|
if (len_diff > 0) {
|
||||||
len = b->mv_size;
|
len = b->mv_size;
|
||||||
|
len_diff = 1;
|
||||||
|
}
|
||||||
|
|
||||||
diff = memcmp(a->mv_data, b->mv_data, len);
|
diff = memcmp(a->mv_data, b->mv_data, len);
|
||||||
return diff ? diff : len_diff;
|
return diff ? diff : len_diff<0 ? -1 : len_diff;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
memnrcmp(const MDB_val *a, const MDB_val *b)
|
memnrcmp(const MDB_val *a, const MDB_val *b)
|
||||||
{
|
{
|
||||||
const unsigned char *p1, *p2, *p1_lim;
|
const unsigned char *p1, *p2, *p1_lim;
|
||||||
int diff, len_diff;
|
ssize_t len_diff;
|
||||||
|
int diff;
|
||||||
|
|
||||||
if (b->mv_size == 0)
|
p1_lim = (const unsigned char *)a->mv_data;
|
||||||
return a->mv_size != 0;
|
p1 = (const unsigned char *)a->mv_data + a->mv_size;
|
||||||
if (a->mv_size == 0)
|
p2 = (const unsigned char *)b->mv_data + b->mv_size;
|
||||||
return -1;
|
|
||||||
|
|
||||||
p1 = (const unsigned char *)a->mv_data + a->mv_size - 1;
|
len_diff = (ssize_t) a->mv_size - (ssize_t) b->mv_size;
|
||||||
p2 = (const unsigned char *)b->mv_data + b->mv_size - 1;
|
if (len_diff > 0) {
|
||||||
|
p1_lim += len_diff;
|
||||||
len_diff = a->mv_size - b->mv_size;
|
len_diff = 1;
|
||||||
if (len_diff < 0)
|
}
|
||||||
p1_lim = p1 - a->mv_size;
|
|
||||||
else
|
|
||||||
p1_lim = p1 - b->mv_size;
|
|
||||||
|
|
||||||
while (p1 > p1_lim) {
|
while (p1 > p1_lim) {
|
||||||
diff = *p1 - *p2;
|
diff = *--p1 - *--p2;
|
||||||
if (diff)
|
if (diff)
|
||||||
return diff;
|
return diff;
|
||||||
p1--;
|
|
||||||
p2--;
|
|
||||||
}
|
}
|
||||||
return len_diff;
|
return len_diff<0 ? -1 : len_diff;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Search for key within a leaf page, using binary search.
|
/* Search for key within a leaf page, using binary search.
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue