From 7f88ad3efce5bc14de49b3d73a5dcb19499e1342 Mon Sep 17 00:00:00 2001 From: Stefan Metzmacher Date: Sat, 24 Nov 2012 10:16:45 +0100 Subject: s4:dsdb/subtree_delete: delete from the leafs to the root (bug #7711) Signed-off-by: Stefan Metzmacher Reviewed-by: Michael Adam --- source4/dsdb/samdb/ldb_modules/subtree_delete.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'source4') diff --git a/source4/dsdb/samdb/ldb_modules/subtree_delete.c b/source4/dsdb/samdb/ldb_modules/subtree_delete.c index f041b7e66e..b1f87f77b5 100644 --- a/source4/dsdb/samdb/ldb_modules/subtree_delete.c +++ b/source4/dsdb/samdb/ldb_modules/subtree_delete.c @@ -38,6 +38,19 @@ #include "dsdb/common/util.h" +static int subtree_delete_sort(struct ldb_message **m1, + struct ldb_message **m2, + void *private_data) +{ + struct ldb_dn *dn1 = (*m1)->dn; + struct ldb_dn *dn2 = (*m2)->dn; + + /* + * This sorts in tree order, children first + */ + return ldb_dn_compare(dn1, dn2); +} + static int subtree_delete(struct ldb_module *module, struct ldb_request *req) { static const char * const attrs[] = { NULL }; @@ -79,6 +92,12 @@ static int subtree_delete(struct ldb_module *module, struct ldb_request *req) return LDB_ERR_NOT_ALLOWED_ON_NON_LEAF; } + /* + * First we sort the results from the leaf to the root + */ + LDB_TYPESAFE_QSORT(res->msgs, res->count, NULL, + subtree_delete_sort); + /* * we need to start from the top since other LDB modules could * enforce constraints (eg "objectclass" and "samldb" do so). -- cgit