summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/util/tsort.h4
-rw-r--r--source4/lib/ldb/common/ldb_dn.c4
-rw-r--r--source4/lib/ldb/common/ldb_msg.c4
-rw-r--r--source4/lib/ldb/include/ldb.h11
-rw-r--r--source4/lib/ldb/ldb_tdb/ldb_index.c2
-rw-r--r--source4/lib/ldb/tools/ldbdel.c10
6 files changed, 23 insertions, 12 deletions
diff --git a/lib/util/tsort.h b/lib/util/tsort.h
index 236b369912..811d6cd2f7 100644
--- a/lib/util/tsort.h
+++ b/lib/util/tsort.h
@@ -27,12 +27,14 @@
a wrapper around qsort() that ensures the comparison function is
type safe.
*/
+#ifndef TYPESAFE_QSORT
#define TYPESAFE_QSORT(base, numel, comparison) \
do { \
if (numel > 1) { \
- qsort(base, numel, sizeof((base)[0]), QSORT_CAST comparison); \
+ qsort(base, numel, sizeof((base)[0]), (int (*)(const void *, const void *))comparison); \
assert(comparison(&((base)[0]), &((base)[1])) <= 0); \
} \
} while (0)
+#endif
#endif
diff --git a/source4/lib/ldb/common/ldb_dn.c b/source4/lib/ldb/common/ldb_dn.c
index 252a0c632b..c395be2900 100644
--- a/source4/lib/ldb/common/ldb_dn.c
+++ b/source4/lib/ldb/common/ldb_dn.c
@@ -824,8 +824,8 @@ char *ldb_dn_get_extended_linearized(void *mem_ctx, struct ldb_dn *dn, int mode)
* the resulting DNs consistent, plus to ensure that we put
* 'DELETED' first, so it can be very quickly recognised
*/
- qsort(dn->ext_components, dn->ext_comp_num, sizeof(dn->ext_components[0]),
- ldb_dn_extended_component_compare);
+ TYPESAFE_QSORT(dn->ext_components, dn->ext_comp_num,
+ ldb_dn_extended_component_compare);
for (i = 0; i < dn->ext_comp_num; i++) {
const struct ldb_dn_extended_syntax *ext_syntax;
diff --git a/source4/lib/ldb/common/ldb_msg.c b/source4/lib/ldb/common/ldb_msg.c
index 9f90f33405..f4adb560b1 100644
--- a/source4/lib/ldb/common/ldb_msg.c
+++ b/source4/lib/ldb/common/ldb_msg.c
@@ -464,8 +464,8 @@ struct ldb_dn *ldb_msg_find_attr_as_dn(struct ldb_context *ldb,
*/
void ldb_msg_sort_elements(struct ldb_message *msg)
{
- qsort(msg->elements, msg->num_elements, sizeof(struct ldb_message_element),
- (comparison_fn_t)ldb_msg_element_compare_name);
+ TYPESAFE_QSORT(msg->elements, msg->num_elements,
+ ldb_msg_element_compare_name);
}
/*
diff --git a/source4/lib/ldb/include/ldb.h b/source4/lib/ldb/include/ldb.h
index 26a196f311..fc5d47ac32 100644
--- a/source4/lib/ldb/include/ldb.h
+++ b/source4/lib/ldb/include/ldb.h
@@ -2002,6 +2002,17 @@ do { \
} \
} while (0)
+/* allow ldb to also call TYPESAFE_QSORT() */
+#ifndef TYPESAFE_QSORT
+#define TYPESAFE_QSORT(base, numel, comparison) \
+do { \
+ if (numel > 1) { \
+ qsort(base, numel, sizeof((base)[0]), (int (*)(const void *, const void *))comparison); \
+ comparison(&((base)[0]), &((base)[1])); \
+ } \
+} while (0)
+#endif
+
/**
diff --git a/source4/lib/ldb/ldb_tdb/ldb_index.c b/source4/lib/ldb/ldb_tdb/ldb_index.c
index 4b31021001..bb4617db09 100644
--- a/source4/lib/ldb/ldb_tdb/ldb_index.c
+++ b/source4/lib/ldb/ldb_tdb/ldb_index.c
@@ -973,7 +973,7 @@ static void ltdb_dn_list_remove_duplicates(struct dn_list *list)
return;
}
- qsort(list->dn, list->count, sizeof(struct ldb_val), (comparison_fn_t) dn_list_cmp);
+ TYPESAFE_QSORT(list->dn, list->count, dn_list_cmp);
new_count = 1;
for (i=1; i<list->count; i++) {
diff --git a/source4/lib/ldb/tools/ldbdel.c b/source4/lib/ldb/tools/ldbdel.c
index 6de15ee042..1b8adf714c 100644
--- a/source4/lib/ldb/tools/ldbdel.c
+++ b/source4/lib/ldb/tools/ldbdel.c
@@ -34,13 +34,11 @@
#include "ldb.h"
#include "tools/cmdline.h"
#include "ldbutil.h"
+#include "replace.h"
-static int dn_cmp(const void *p1, const void *p2)
+static int dn_cmp(struct ldb_message **msg1, struct ldb_message **msg2)
{
- const struct ldb_message *msg1, *msg2;
- msg1 = *(const struct ldb_message * const *)p1;
- msg2 = *(const struct ldb_message * const *)p2;
- return ldb_dn_compare(msg1->dn, msg2->dn);
+ return ldb_dn_compare((*msg1)->dn, (*msg2)->dn);
}
static int ldb_delete_recursive(struct ldb_context *ldb, struct ldb_dn *dn,struct ldb_control **req_ctrls)
@@ -53,7 +51,7 @@ static int ldb_delete_recursive(struct ldb_context *ldb, struct ldb_dn *dn,struc
if (ret != LDB_SUCCESS) return -1;
/* sort the DNs, deepest first */
- qsort(res->msgs, res->count, sizeof(res->msgs[0]), dn_cmp);
+ TYPESAFE_QSORT(res->msgs, res->count, dn_cmp);
for (i = 0; i < res->count; i++) {
if (ldb_delete_ctrl(ldb, res->msgs[i]->dn,req_ctrls) == 0) {