diff options
-rw-r--r-- | lib/util/tsort.h | 4 | ||||
-rw-r--r-- | source4/lib/ldb/common/ldb_dn.c | 4 | ||||
-rw-r--r-- | source4/lib/ldb/common/ldb_msg.c | 4 | ||||
-rw-r--r-- | source4/lib/ldb/include/ldb.h | 11 | ||||
-rw-r--r-- | source4/lib/ldb/ldb_tdb/ldb_index.c | 2 | ||||
-rw-r--r-- | source4/lib/ldb/tools/ldbdel.c | 10 |
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) { |