diff options
Diffstat (limited to 'source4/dsdb/samdb')
-rw-r--r-- | source4/dsdb/samdb/ldb_modules/subtree_delete.c | 19 |
1 files changed, 19 insertions, 0 deletions
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 }; @@ -80,6 +93,12 @@ static int subtree_delete(struct ldb_module *module, struct ldb_request *req) } /* + * 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). * |