From f279b57f194d1be3600215b98e7e5fc6431d31c3 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 28 Sep 2009 12:28:59 +1000 Subject: s4-dsdb: don't return the partition root objects When searching across partitions, we want to avoid sending duplicate records caused by the record appearing both as a mount point and as a partition root in a nested partition. This patch works by intercepting objects from searches and checking if they match a partition root. If they do, and the partition is not the one in the partition control request, then discard the object. --- source4/dsdb/samdb/ldb_modules/partition.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'source4/dsdb/samdb') diff --git a/source4/dsdb/samdb/ldb_modules/partition.c b/source4/dsdb/samdb/ldb_modules/partition.c index 79d11fd958..6e86d4c484 100644 --- a/source4/dsdb/samdb/ldb_modules/partition.c +++ b/source4/dsdb/samdb/ldb_modules/partition.c @@ -186,9 +186,11 @@ static int partition_req_callback(struct ldb_request *req, struct partition_context *ac; struct ldb_module *module; struct ldb_request *nreq; - int ret; + int ret, i; + struct partition_private_data *data; ac = talloc_get_type(req->context, struct partition_context); + data = talloc_get_type(ac->module->private_data, struct partition_private_data); if (!ares) { return ldb_module_done(ac->req, NULL, NULL, @@ -213,6 +215,22 @@ static int partition_req_callback(struct ldb_request *req, return ldb_module_done(ac->req, NULL, NULL, LDB_ERR_OPERATIONS_ERROR); } + for (i=0; data && data->partitions && data->partitions[i]; i++) { + if (ldb_dn_compare(ares->message->dn, data->partitions[i]->ctrl->dn) == 0) { + struct ldb_control *part_control; + /* this is a partition root message - make + sure it isn't one of our fake root + entries from a parent partition */ + part_control = ldb_request_get_control(req, DSDB_CONTROL_CURRENT_PARTITION_OID); + if (part_control && part_control->data != data->partitions[i]->ctrl) { + DEBUG(6,(__location__ ": Discarding partition mount object %s\n", + ldb_dn_get_linearized(ares->message->dn))); + talloc_free(ares); + return LDB_SUCCESS; + } + } + } + return ldb_module_send_entry(ac->req, ares->message, ares->controls); case LDB_REPLY_DONE: -- cgit