The branch, master has been updated
       via  22fcb8e s4:lib/tls/wscript - exclude known broken GNUTLS releases
       via  f5ce61e lib/util/fault.c - "call_backtrace" - no need to have 
"backtrace_size" as size_t
       via  e00893d s4:extended_dn_store LDB module - use the new request as 
generic memory contexts
       via  0cec610 s4:repl_meta_data LDB module - always ask manually for the 
current partition control
       via  68fbfa2 s4:partition LDB module - the current partition control 
should only be added if requested
       via  78b46c5 s4:partition LDB module - extended operations - make the 
initialisation check consistent
       via  e52c900 s4:partition LDB module - move the "data" check a bit higher
       via  4e6b8e0 s4:partition LDB module - "partition_replicate" doesn't 
handle the search requests
       via  210cab9 s4:partition LDB module - "partition_sequence_number" - 
remove meaningless "if"s
       via  96600e5 s4:simple_ldap_map LDB module - enhance current partition 
control checks
       via  e669295 s4:repl_meta_data LDB module - don't remove the partition 
control twice
       via  e754f0c s4:repl_meta_data LDB module - remove the current partition 
control unless it was requested
       via  42da193 s4:new_partition LDB module - splitting up an "if" operation
       via  83517d2 s4:instancetype LDB module - perform here only the 
"instanceType" constraint checks
       via  8ce1314 s4:instancetype LDB module - don't impede control requests
       via  f68d542 s4:instancetype LDB module - use "ldb" pointer for 
referencing the LDB context
       via  8872a62 s4:partition LDB module - fill in parent requests for 
inheriting the flags
       via  b7ecc33 ldb:ldb_controls.c - "ldb_save_controls" - allow that 
"saver" can also be NULL
       via  78c9eb1 ldb:ldb_controls.c - always allocate enough space
       via  851396a s4:partition LDB module - add some comments
       via  79c65cc s4:new_partition LDB module - fix comments
       via  d2acd72 s4:partition_init LDB module - fix a typo
       via  82067b1 s4:partition LDB module - fix typo
       via  7aa0219 s4:setup/provision - fix an output message
      from  cdb9e4b libwbclient: Add some input check

http://gitweb.samba.org/?p=samba.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 22fcb8e4945ac43fda6f6891ea00f36a53e52102
Author: Matthias Dieter Wallnöfer <[email protected]>
Date:   Wed Mar 9 09:29:30 2011 +0100

    s4:lib/tls/wscript - exclude known broken GNUTLS releases
    
    This definitely fixes bug #7218.
    
    Autobuild-User: Matthias Dieter Wallnöfer <[email protected]>
    Autobuild-Date: Thu Mar 10 11:58:27 CET 2011 on sn-devel-104

commit f5ce61ea57e4851999eb0a2a805a5e2aab5b86e4
Author: Matthias Dieter Wallnöfer <[email protected]>
Date:   Wed Mar 9 09:09:15 2011 +0100

    lib/util/fault.c - "call_backtrace" - no need to have "backtrace_size" as 
size_t
    
    The function "backtrace" returns an "int".

commit e00893d8395ed813a5bc9dd7bf28f29de369db46
Author: Matthias Dieter Wallnöfer <[email protected]>
Date:   Sun Mar 6 21:46:02 2011 +0100

    s4:extended_dn_store LDB module - use the new request as generic memory 
contexts
    
    To prevent memory leaks under valgrind.

commit 0cec6107d870ba2e67859b824306cde0686691cb
Author: Matthias Dieter Wallnöfer <[email protected]>
Date:   Sat Mar 5 14:42:40 2011 +0100

    s4:repl_meta_data LDB module - always ask manually for the current 
partition control
    
    Otherwise the "partition" LDB module doesn't give it back anymore.

commit 68fbfa2237a570a48d2ae3a5421cdcacae6e6d34
Author: Matthias Dieter Wallnöfer <[email protected]>
Date:   Sat Mar 5 14:25:59 2011 +0100

    s4:partition LDB module - the current partition control should only be 
added if requested
    
    That means if the informations before a request are unknown
    ("repl_meta_data" LDB module) then an empty control (no data) has to be 
sent.

commit 78b46c533a36cdfa6c5f8ab305f13c5aa142b819
Author: Matthias Dieter Wallnöfer <[email protected]>
Date:   Sun Mar 6 15:56:48 2011 +0100

    s4:partition LDB module - extended operations - make the initialisation 
check consistent
    
    To the other operations.

commit e52c900b63bf61daf64e5495241a257a40998a06
Author: Matthias Dieter Wallnöfer <[email protected]>
Date:   Sun Mar 6 15:56:06 2011 +0100

    s4:partition LDB module - move the "data" check a bit higher
    
    It can be performed a bit earlier.

commit 4e6b8e0a181b2fa78fd72e7e2724ad5acd81672b
Author: Matthias Dieter Wallnöfer <[email protected]>
Date:   Sun Mar 6 15:37:51 2011 +0100

    s4:partition LDB module - "partition_replicate" doesn't handle the search 
requests
    
    That is done by "partition_search".

commit 210cab9bf0a72b670d20ea16f1f483e41b5a503c
Author: Matthias Dieter Wallnöfer <[email protected]>
Date:   Sat Mar 5 19:02:43 2011 +0100

    s4:partition LDB module - "partition_sequence_number" - remove meaningless 
"if"s
    
    These current partition controls are always added for the two EXOP 
operations.

commit 96600e5df185c5d3b774870c5339a8fcbf412ff5
Author: Matthias Dieter Wallnöfer <[email protected]>
Date:   Sat Mar 5 14:52:18 2011 +0100

    s4:simple_ldap_map LDB module - enhance current partition control checks
    
    Don't stop the server if it hasn't been filled in correctly. An LDB
    error should be enough.
    
    Modified by request of tridge: errorcodes changed to ERR_PROTOCOL_ERROR

commit e669295a37b9900c58707bfd5bce55197655ed95
Author: Matthias Dieter Wallnöfer <[email protected]>
Date:   Sat Mar 5 13:56:10 2011 +0100

    s4:repl_meta_data LDB module - don't remove the partition control twice
    
    "controls" is already the controls list which has the partition control
    removed. It is generated by "ldb_controls_except_specified" in line 378.

commit e754f0c5c6add20f8f2217033205432597d133fd
Author: Matthias Dieter Wallnöfer <[email protected]>
Date:   Sat Mar 5 20:38:14 2011 +0100

    s4:repl_meta_data LDB module - remove the current partition control unless 
it was requested

commit 42da193c37e1f3076b1299e761bc973f290bb800
Author: Matthias Dieter Wallnöfer <[email protected]>
Date:   Sat Mar 5 17:15:55 2011 +0100

    s4:new_partition LDB module - splitting up an "if" operation
    
    - let the first "if" in place
    - uninstantiated partitions are handled by the second "if" (previously
      they have been handled twice)
    
    Has been corrected by request of tridge.

commit 83517d2e597878b86dc51edc6bb0bf25c7d62068
Author: Matthias Dieter Wallnöfer <[email protected]>
Date:   Sat Mar 5 17:24:10 2011 +0100

    s4:instancetype LDB module - perform here only the "instanceType" 
constraint checks
    
    The boilerplate entries (when this support has been implemented) should
    be provided by the "new_partition" LDB module. These are for example the
    deleted object and lost and found container.

commit 8ce131431ca00882ade037430b31cbd3f9c0445e
Author: Matthias Dieter Wallnöfer <[email protected]>
Date:   Sat Mar 5 17:28:13 2011 +0100

    s4:instancetype LDB module - don't impede control requests

commit f68d54269cd087dc7f9168fe2711beddcb0ce94e
Author: Matthias Dieter Wallnöfer <[email protected]>
Date:   Sat Mar 5 16:59:02 2011 +0100

    s4:instancetype LDB module - use "ldb" pointer for referencing the LDB 
context

commit 8872a622667a9f2ff7a7213ae2ba82d93e3e14b2
Author: Matthias Dieter Wallnöfer <[email protected]>
Date:   Sat Mar 5 18:45:08 2011 +0100

    s4:partition LDB module - fill in parent requests for inheriting the flags
    
    Probably it doesn't matter in this cases but just for consistency.

commit b7ecc33ef9eae1a1ebe503a2d1d8c8ed21fb7ccf
Author: Matthias Dieter Wallnöfer <[email protected]>
Date:   Thu Mar 10 09:28:30 2011 +0100

    ldb:ldb_controls.c - "ldb_save_controls" - allow that "saver" can also be 
NULL
    
    Suggested by Tridge

commit 78c9eb1a06a696fc6ba85110a4f7d661bbb661d3
Author: Matthias Dieter Wallnöfer <[email protected]>
Date:   Sun Mar 6 20:16:43 2011 +0100

    ldb:ldb_controls.c - always allocate enough space
    
    The size for an additional "struct ldb_control" shouldn't hurt and so
    the excluded control can also be NULL.
    
    Added an ending "talloc_realloc" to resize the chunk to the
    effective needed size (requested by tridge).

commit 851396a627ed2c09c5e309fc72cfa2a10c3c3726
Author: Matthias Dieter Wallnöfer <[email protected]>
Date:   Sun Mar 6 15:55:45 2011 +0100

    s4:partition LDB module - add some comments

commit 79c65cc99b30af092608fa758a748ca0301ddf33
Author: Matthias Dieter Wallnöfer <[email protected]>
Date:   Sat Mar 5 17:15:19 2011 +0100

    s4:new_partition LDB module - fix comments

commit d2acd729942a2a04b4011072184a59b1a6cebf87
Author: Matthias Dieter Wallnöfer <[email protected]>
Date:   Sun Mar 6 15:51:12 2011 +0100

    s4:partition_init LDB module - fix a typo

commit 82067b1a61c164523e881c4244a2e96a59fa497e
Author: Matthias Dieter Wallnöfer <[email protected]>
Date:   Sat Mar 5 14:15:38 2011 +0100

    s4:partition LDB module - fix typo

commit 7aa0219be8a0d4d5b8adccb4d855952182b145a4
Author: Matthias Dieter Wallnöfer <[email protected]>
Date:   Sun Mar 6 17:46:08 2011 +0100

    s4:setup/provision - fix an output message
    
    Mention that Windows 2000 function level is supported as well.

-----------------------------------------------------------------------

Summary of changes:
 lib/util/fault.c                                   |    2 +-
 source4/dsdb/samdb/ldb_modules/extended_dn_store.c |    4 +-
 source4/dsdb/samdb/ldb_modules/instancetype.c      |  101 +++++---------------
 source4/dsdb/samdb/ldb_modules/new_partition.c     |   12 +-
 source4/dsdb/samdb/ldb_modules/partition.c         |   82 +++++++++-------
 source4/dsdb/samdb/ldb_modules/partition_init.c    |    2 +-
 source4/dsdb/samdb/ldb_modules/repl_meta_data.c    |   61 +++++++++++-
 source4/dsdb/samdb/ldb_modules/simple_ldap_map.c   |   10 ++-
 source4/lib/ldb/common/ldb_controls.c              |   54 +++++++----
 source4/lib/tls/wscript                            |    4 +-
 source4/setup/provision                            |    2 +-
 11 files changed, 184 insertions(+), 150 deletions(-)


Changeset truncated at 500 lines:

diff --git a/lib/util/fault.c b/lib/util/fault.c
index 256e55a..29b45ee 100644
--- a/lib/util/fault.c
+++ b/lib/util/fault.c
@@ -51,7 +51,7 @@ _PUBLIC_ void call_backtrace(void)
 #define BACKTRACE_STACK_SIZE 64
 #endif
        void *backtrace_stack[BACKTRACE_STACK_SIZE];
-       size_t backtrace_size;
+       int backtrace_size;
        char **backtrace_strings;
 
        /* get the backtrace (stack frames) */
diff --git a/source4/dsdb/samdb/ldb_modules/extended_dn_store.c 
b/source4/dsdb/samdb/ldb_modules/extended_dn_store.c
index b4f71e9..c423520 100644
--- a/source4/dsdb/samdb/ldb_modules/extended_dn_store.c
+++ b/source4/dsdb/samdb/ldb_modules/extended_dn_store.c
@@ -345,7 +345,7 @@ static int extended_dn_add(struct ldb_module *module, 
struct ldb_request *req)
                /* Re-calculate el */
                el = &ac->new_req->op.add.message->elements[i];
                for (j = 0; j < el->num_values; j++) {
-                       ret = extended_store_replace(ac, 
ac->new_req->op.add.message->elements, &el->values[j],
+                       ret = extended_store_replace(ac, ac->new_req, 
&el->values[j],
                                                     false, 
schema_attr->syntax->ldap_oid);
                        if (ret != LDB_SUCCESS) {
                                return ret;
@@ -429,7 +429,7 @@ static int extended_dn_modify(struct ldb_module *module, 
struct ldb_request *req
                         * input of an extended DN */
                        bool is_delete = (LDB_FLAG_MOD_TYPE(el->flags) == 
LDB_FLAG_MOD_DELETE);
 
-                       ret = extended_store_replace(ac, 
req->op.mod.message->elements, &el->values[j],
+                       ret = extended_store_replace(ac, ac->new_req, 
&el->values[j],
                                                     is_delete, 
schema_attr->syntax->ldap_oid);
                        if (ret != LDB_SUCCESS) {
                                talloc_free(ac);
diff --git a/source4/dsdb/samdb/ldb_modules/instancetype.c 
b/source4/dsdb/samdb/ldb_modules/instancetype.c
index c557fe1..e008deb 100644
--- a/source4/dsdb/samdb/ldb_modules/instancetype.c
+++ b/source4/dsdb/samdb/ldb_modules/instancetype.c
@@ -38,66 +38,23 @@
 #include "../libds/common/flags.h"
 #include "dsdb/samdb/ldb_modules/util.h"
 
-struct it_context {
-       struct ldb_module *module;
-       struct ldb_request *req;
-       struct ldb_request *add_req;
-};
-
-static int it_add_callback(struct ldb_request *req, struct ldb_reply *ares)
-{
-       struct ldb_context *ldb;
-       struct it_context *ac;
-
-       ac = talloc_get_type(req->context, struct it_context);
-       ldb = ldb_module_get_ctx(ac->module);
-
-       if (!ares) {
-               return ldb_module_done(ac->req, NULL, NULL,
-                                       LDB_ERR_OPERATIONS_ERROR);
-       }
-
-       if (ares->type == LDB_REPLY_REFERRAL) {
-               return ldb_module_send_referral(ac->req, ares->referral);
-       }
-
-       if (ares->error != LDB_SUCCESS) {
-               return ldb_module_done(ac->req, ares->controls,
-                                       ares->response, ares->error);
-       }
-
-       if (ares->type != LDB_REPLY_DONE) {
-               ldb_set_errstring(ldb, "Invalid reply type!");
-               return ldb_module_done(ac->req, NULL, NULL,
-                                       LDB_ERR_OPERATIONS_ERROR);
-       }
-
-       /* Add the boilerplate entries */
-
-       return ldb_module_done(ac->req, ares->controls,
-                              ares->response, ares->error);
-}
-
 /* add_record: add instancetype attribute */
 static int instancetype_add(struct ldb_module *module, struct ldb_request *req)
 {
-       struct ldb_context *ldb;
+       struct ldb_context *ldb = ldb_module_get_ctx(module);
        struct ldb_request *down_req;
        struct ldb_message *msg;
        struct ldb_message_element *el;
-       struct it_context *ac;
        uint32_t instanceType;
        int ret;
 
-       ldb = ldb_module_get_ctx(module);
-
-       ldb_debug(ldb, LDB_DEBUG_TRACE, "instancetype_add_record\n");
-
        /* do not manipulate our control entries */
        if (ldb_dn_is_special(req->op.add.message->dn)) {
                return ldb_next_request(module, req);
        }
 
+       ldb_debug(ldb, LDB_DEBUG_TRACE, "instancetype_add\n");
+
        el = ldb_msg_find_element(req->op.add.message, "instanceType");
        if (el != NULL) {
                if (el->num_values != 1) {
@@ -108,7 +65,8 @@ static int instancetype_add(struct ldb_module *module, 
struct ldb_request *req)
                instanceType = ldb_msg_find_attr_as_uint(req->op.add.message,
                                                         "instanceType", 0);
                if (!(instanceType & INSTANCE_TYPE_IS_NC_HEAD)) {
-                       /* if we have no NC add operation (no TYPE_IS_NC_HEAD)
+                       /*
+                        * If we have no NC add operation (no TYPE_IS_NC_HEAD)
                         * then "instanceType" can only be "0" or "TYPE_WRITE".
                         */
                        if ((instanceType != 0) &&
@@ -116,39 +74,19 @@ static int instancetype_add(struct ldb_module *module, 
struct ldb_request *req)
                                ldb_set_errstring(ldb, "instancetype: if 
TYPE_IS_NC_HEAD wasn't set, then only TYPE_WRITE or 0 are allowed!");
                                return LDB_ERR_UNWILLING_TO_PERFORM;
                        }
-
-                       return ldb_next_request(module, req);           
-               }
-
-               /* if we have a NC add operation then we need also the
-                * "TYPE_WRITE" flag in order to succeed. */
-               if (!(instanceType & INSTANCE_TYPE_WRITE)) {
-                       ldb_set_errstring(ldb, "instancetype: if 
TYPE_IS_NC_HEAD was set, then also TYPE_WRITE is requested!");
-                       return LDB_ERR_UNWILLING_TO_PERFORM;
+               } else {
+                       /*
+                        * If we have a NC add operation then we need also the
+                        * "TYPE_WRITE" flag in order to succeed.
+                       */
+                       if (!(instanceType & INSTANCE_TYPE_WRITE)) {
+                               ldb_set_errstring(ldb, "instancetype: if 
TYPE_IS_NC_HEAD was set, then also TYPE_WRITE is requested!");
+                               return LDB_ERR_UNWILLING_TO_PERFORM;
+                       }
                }
 
-               /* Forward the 'add' to the modules below, but if it
-                * succeeds, then we might need to add the boilerplate
-                * entries (lost+found, deleted objects) */
-               ac = talloc(req, struct it_context);
-               if (ac == NULL) {
-                       return ldb_oom(ldb);
-               }
-               ac->module = module;
-               ac->req = req;
-               
-               ret = ldb_build_add_req(&ac->add_req, 
ldb_module_get_ctx(ac->module), ac,
-                                       ac->req->op.add.message,
-                                       ac->req->controls,
-                                       ac, it_add_callback,
-                                       ac->req);
-               LDB_REQ_SET_LOCATION(ac->add_req);
-               if (ret != LDB_SUCCESS) {
-                       return ret;
-               }
-               
-               /* Do the original add */
-               return ldb_next_request(ac->module, ac->add_req);
+               /* we did only tests, so proceed with the original request */
+               return ldb_next_request(module, req);
        }
 
        /* we have to copy the message as the caller might have it as a const */
@@ -187,6 +125,13 @@ static int instancetype_mod(struct ldb_module *module, 
struct ldb_request *req)
        struct ldb_context *ldb = ldb_module_get_ctx(module);
        struct ldb_message_element *el;
 
+       /* do not manipulate our control entries */
+       if (ldb_dn_is_special(req->op.mod.message->dn)) {
+               return ldb_next_request(module, req);
+       }
+
+       ldb_debug(ldb, LDB_DEBUG_TRACE, "instancetype_mod\n");
+
        el = ldb_msg_find_element(req->op.mod.message, "instanceType");
        if (el != NULL) {
                ldb_set_errstring(ldb, "instancetype: the 'instanceType' 
attribute can never be changed!");
diff --git a/source4/dsdb/samdb/ldb_modules/new_partition.c 
b/source4/dsdb/samdb/ldb_modules/new_partition.c
index 8eb3de8..3d94bbe 100644
--- a/source4/dsdb/samdb/ldb_modules/new_partition.c
+++ b/source4/dsdb/samdb/ldb_modules/new_partition.c
@@ -23,9 +23,9 @@
 /*
  *  Name: ldb
  *
- *  Component: ldb instancetype module
+ *  Component: ldb new partition module
  *
- *  Description: add an instanceType onto every new record
+ *  Description: Handle the add of new partitions
  *
  *  Author: Andrew Bartlett
  */
@@ -140,7 +140,7 @@ static int new_partition_add(struct ldb_module *module, 
struct ldb_request *req)
 
        ldb = ldb_module_get_ctx(module);
 
-       ldb_debug(ldb, LDB_DEBUG_TRACE, "instancetype_add_record\n");
+       ldb_debug(ldb, LDB_DEBUG_TRACE, "new_partition_add\n");
 
        /* do not manipulate our control entries */
        if (ldb_dn_is_special(req->op.add.message->dn)) {
@@ -150,9 +150,9 @@ static int new_partition_add(struct ldb_module *module, 
struct ldb_request *req)
        if (ldb_msg_find_element(req->op.add.message, "instanceType")) {
                /* This needs to be 'static' to ensure it does not move, and is 
not on the stack */
                static const char *no_attrs[] = { NULL };
-               unsigned int instanceType = 
ldb_msg_find_attr_as_uint(req->op.add.message, "instanceType", 0);
-               if (!(instanceType & INSTANCE_TYPE_IS_NC_HEAD) ||
-                   (instanceType & INSTANCE_TYPE_UNINSTANT)) {
+               uint32_t instanceType = 
ldb_msg_find_attr_as_uint(req->op.add.message, "instanceType", 0);
+
+               if (!(instanceType & INSTANCE_TYPE_IS_NC_HEAD)) {
                        return ldb_next_request(module, req);
                }
 
diff --git a/source4/dsdb/samdb/ldb_modules/partition.c 
b/source4/dsdb/samdb/ldb_modules/partition.c
index 613cfa3..ba77ca0 100644
--- a/source4/dsdb/samdb/ldb_modules/partition.c
+++ b/source4/dsdb/samdb/ldb_modules/partition.c
@@ -149,7 +149,7 @@ static int partition_req_callback(struct ldb_request *req,
        if (partition_ctrl && (ac->num_requests == 1 || ares->type == 
LDB_REPLY_ENTRY)) {
                /* If we didn't fan this request out to mulitple partitions,
                 * or this is an individual search result, we can
-                * deterministily tell the caller what partition this was
+                * deterministically tell the caller what partition this was
                 * written to (repl_meta_data likes to know) */
                ret = ldb_reply_add_control(ares,
                                            DSDB_CONTROL_CURRENT_PARTITION_OID,
@@ -239,6 +239,7 @@ static int partition_prep_request(struct partition_context 
*ac,
 {
        int ret;
        struct ldb_request *req;
+       struct ldb_control *partition_ctrl = NULL;
 
        ac->part_req = talloc_realloc(ac, ac->part_req,
                                        struct part_request,
@@ -316,20 +317,31 @@ static int partition_prep_request(struct 
partition_context *ac,
        ac->part_req[ac->num_requests].req = req;
 
        if (ac->req->controls) {
-               req->controls = talloc_memdup(req, ac->req->controls,
-                                       talloc_get_size(ac->req->controls));
-               if (req->controls == NULL) {
-                       return ldb_oom(ldb_module_get_ctx(ac->module));
+               /* Duplicate everything beside the current partition control */
+               partition_ctrl = ldb_request_get_control(ac->req,
+                                                        
DSDB_CONTROL_CURRENT_PARTITION_OID);
+               if (!ldb_save_controls(partition_ctrl, req, NULL)) {
+                       return ldb_module_oom(ac->module);
                }
        }
 
        if (partition) {
+               void *part_data = partition->ctrl;
+
                ac->part_req[ac->num_requests].module = partition->module;
 
-               if (!ldb_request_get_control(req, 
DSDB_CONTROL_CURRENT_PARTITION_OID)) {
+               if (partition_ctrl != NULL) {
+                       if (partition_ctrl->data != NULL) {
+                               part_data = partition_ctrl->data;
+                       }
+
+                       /*
+                        * If the provided current partition control is without
+                        * data then use the calculated one.
+                        */
                        ret = ldb_request_add_control(req,
                                                      
DSDB_CONTROL_CURRENT_PARTITION_OID,
-                                                     false, partition->ctrl);
+                                                     false, part_data);
                        if (ret != LDB_SUCCESS) {
                                return ret;
                        }
@@ -398,11 +410,13 @@ static int partition_replicate(struct ldb_module *module, 
struct ldb_request *re
        struct dsdb_partition *partition;
        struct partition_private_data *data = 
talloc_get_type(ldb_module_get_private(module),
                                                              struct 
partition_private_data);
+
+       /* if we aren't initialised yet go further */
        if (!data || !data->partitions) {
                return ldb_next_request(module, req);
        }
 
-       if (req->operation != LDB_SEARCH && ldb_dn_is_special(dn)) {
+       if (ldb_dn_is_special(dn)) {
                /* Is this a special DN, we need to replicate to every backend? 
*/
                for (i=0; data->replicate && data->replicate[i]; i++) {
                        if (ldb_dn_compare(data->replicate[i], 
@@ -468,7 +482,8 @@ static int partition_search(struct ldb_module *module, 
struct ldb_request *req)
        unsigned int i, j;
        int ret;
        bool domain_scope = false, phantom_root = false;
-       
+
+       /* see if we are still up-to-date */
        ret = partition_reload_if_required(module, data, req);
        if (ret != LDB_SUCCESS) {
                return ret;
@@ -497,6 +512,11 @@ static int partition_search(struct ldb_module *module, 
struct ldb_request *req)
                return ldb_oom(ldb_module_get_ctx(module));
        }
 
+       /* if we aren't initialised yet go further */
+       if (!data || !data->partitions) {
+               return ldb_next_request(module, req);
+       }
+
        /* Locate the options */
        domain_scope = (search_options
                && (search_options->search_options & 
LDB_SEARCH_OPTION_DOMAIN_SCOPE))
@@ -511,10 +531,6 @@ static int partition_search(struct ldb_module *module, 
struct ldb_request *req)
                        & ~LDB_SEARCH_OPTION_PHANTOM_ROOT;
        }
 
-       if (!data || !data->partitions) {
-               return ldb_next_request(module, req);
-       }
-
        ac = partition_init_ctx(module, req);
        if (!ac) {
                return ldb_operr(ldb_module_get_ctx(module));
@@ -973,21 +989,19 @@ static int partition_sequence_number(struct ldb_module 
*module, struct ldb_reque
                                                     NULL,
                                                     res,
                                                     
ldb_extended_default_callback,
-                                                    NULL);
+                                                    req);
                        LDB_REQ_SET_LOCATION(treq);
                        if (ret != LDB_SUCCESS) {
                                talloc_free(res);
                                return ret;
                        }
 
-                       if (!ldb_request_get_control(treq, 
DSDB_CONTROL_CURRENT_PARTITION_OID)) {
-                               ret = ldb_request_add_control(treq,
-                                                             
DSDB_CONTROL_CURRENT_PARTITION_OID,
-                                                             false, 
data->partitions[i]->ctrl);
-                               if (ret != LDB_SUCCESS) {
-                                       talloc_free(res);
-                                       return ret;
-                               }
+                       ret = ldb_request_add_control(treq,
+                                                     
DSDB_CONTROL_CURRENT_PARTITION_OID,
+                                                     false, 
data->partitions[i]->ctrl);
+                       if (ret != LDB_SUCCESS) {
+                               talloc_free(res);
+                               return ret;
                        }
 
                        ret = partition_request(data->partitions[i]->module, 
treq);
@@ -1031,7 +1045,7 @@ static int partition_sequence_number(struct ldb_module 
*module, struct ldb_reque
                                             NULL,
                                             res,
                                             ldb_extended_default_callback,
-                                            NULL);
+                                            req);
                LDB_REQ_SET_LOCATION(treq);
                if (ret != LDB_SUCCESS) {
                        talloc_free(res);
@@ -1076,21 +1090,19 @@ static int partition_sequence_number(struct ldb_module 
*module, struct ldb_reque
                                                     NULL,
                                                     res,
                                                     
ldb_extended_default_callback,
-                                                    NULL);
+                                                    req);
                        LDB_REQ_SET_LOCATION(treq);
                        if (ret != LDB_SUCCESS) {
                                talloc_free(res);
                                return ret;
                        }
 
-                       if (!ldb_request_get_control(treq, 
DSDB_CONTROL_CURRENT_PARTITION_OID)) {
-                               ret = ldb_request_add_control(treq,
-                                                             
DSDB_CONTROL_CURRENT_PARTITION_OID,
-                                                             false, 
data->partitions[i]->ctrl);
-                               if (ret != LDB_SUCCESS) {
-                                       talloc_free(res);
-                                       return ret;
-                               }
+                       ret = ldb_request_add_control(treq,
+                                                     
DSDB_CONTROL_CURRENT_PARTITION_OID,
+                                                     false, 
data->partitions[i]->ctrl);
+                       if (ret != LDB_SUCCESS) {
+                               talloc_free(res);
+                               return ret;
                        }
 
                        ret = partition_request(data->partitions[i]->module, 
treq);
@@ -1160,15 +1172,17 @@ static int partition_sequence_number(struct ldb_module 
*module, struct ldb_reque
 /* extended */
 static int partition_extended(struct ldb_module *module, struct ldb_request 
*req)
 {
-       struct partition_private_data *data;
+       struct partition_private_data *data = 
talloc_get_type(ldb_module_get_private(module),
+                                                             struct 
partition_private_data);
        struct partition_context *ac;
        int ret;
 
-       data = talloc_get_type(ldb_module_get_private(module), struct 
partition_private_data);
+       /* if we aren't initialised yet go further */
        if (!data) {
                return ldb_next_request(module, req);
        }
 
+       /* see if we are still up-to-date */
        ret = partition_reload_if_required(module, data, req);
        if (ret != LDB_SUCCESS) {
                return ret;
diff --git a/source4/dsdb/samdb/ldb_modules/partition_init.c 
b/source4/dsdb/samdb/ldb_modules/partition_init.c
index 97fc670..50aabc9 100644
--- a/source4/dsdb/samdb/ldb_modules/partition_init.c
+++ b/source4/dsdb/samdb/ldb_modules/partition_init.c
@@ -386,7 +386,7 @@ int partition_reload_if_required(struct ldb_module *module,
        TALLOC_CTX *mem_ctx;
 
        if (!data) {
-               /* Not initilised yet */
+               /* Not initialised yet */
                return LDB_SUCCESS;
        }
 
diff --git a/source4/dsdb/samdb/ldb_modules/repl_meta_data.c 
b/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
index 6fd6d7f..b38f45f 100644
--- a/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
+++ b/source4/dsdb/samdb/ldb_modules/repl_meta_data.c
@@ -374,8 +374,16 @@ static int replmd_op_callback(struct ldb_request *req, 
struct ldb_reply *ares)
 
        partition_ctrl = ldb_reply_get_control(ares, 
DSDB_CONTROL_CURRENT_PARTITION_OID);
 
-       /* Remove the 'partition' control from what we pass up the chain */
-       controls = ldb_controls_except_specified(ares->controls, ares, 
partition_ctrl);
+       controls = ares->controls;
+       if (ldb_request_get_control(ac->req,
+                                   DSDB_CONTROL_CURRENT_PARTITION_OID) == 
NULL) {
+               /*
+                * Remove the current partition control from what we pass up
+                * the chain if it hasn't been requested manually.
+                */
+               controls = ldb_controls_except_specified(ares->controls, ares,
+                                                        partition_ctrl);
+       }
 
        if (ares->error != LDB_SUCCESS) {
                DEBUG(0,("%s failure. Error is: %s\n", __FUNCTION__, 
ldb_strerror(ares->error)));
@@ -444,8 +452,7 @@ static int replmd_op_callback(struct ldb_request *req, 
struct ldb_reply *ares)
                 * common path.  Other cases will have it cleaned up
                 * eventually with the ares */
                talloc_free(partition_ctrl);
-               return ldb_module_done(ac->req,
-                                      ldb_controls_except_specified(controls, 
ares, partition_ctrl),
+               return ldb_module_done(ac->req, controls,
                                       ares->response, LDB_SUCCESS);
        }
 }
@@ -986,6 +993,17 @@ static int replmd_add(struct ldb_module *module, struct 
ldb_request *req)
                return ret;
        }
 
+       /* current partition control is needed by "replmd_op_callback" */
+       if (ldb_request_get_control(req, DSDB_CONTROL_CURRENT_PARTITION_OID) == 
NULL) {
+               ret = ldb_request_add_control(down_req,
+                                             
DSDB_CONTROL_CURRENT_PARTITION_OID,
+                                             false, NULL);
+               if (ret != LDB_SUCCESS) {
+                       talloc_free(ac);
+                       return ret;
+               }
+       }
+
        if (functional_level == DS_DOMAIN_FUNCTION_2000) {
                ret = ldb_request_add_control(down_req, 
DSDB_CONTROL_APPLY_LINKS, false, NULL);
                if (ret != LDB_SUCCESS) {
@@ -2239,6 +2257,17 @@ static int replmd_modify(struct ldb_module *module, 
struct ldb_request *req)
                return ret;
        }
 
+       /* current partition control is needed by "replmd_op_callback" */
+       if (ldb_request_get_control(req, DSDB_CONTROL_CURRENT_PARTITION_OID) == 
NULL) {
+               ret = ldb_request_add_control(down_req,
+                                             
DSDB_CONTROL_CURRENT_PARTITION_OID,
+                                             false, NULL);
+               if (ret != LDB_SUCCESS) {
+                       talloc_free(ac);
+                       return ret;
+               }
+       }
+
        /* If we are in functional level 2000, then
         * replmd_modify_handle_linked_attribs will have done
         * nothing */
@@ -2371,6 +2400,18 @@ static int replmd_rename_callback(struct ldb_request 
*req, struct ldb_reply *are
                talloc_free(ac);


-- 
Samba Shared Repository

Reply via email to