samba-technical@lists.samba.org
[Top] [All Lists]

Re: [PATCH] Re: Fix up NET-API-BECOME-DC and repl_meta_data

Subject: Re: [PATCH] Re: Fix up NET-API-BECOME-DC and repl_meta_data
From: "Stefan (metze) Metzmacher"
Date: Tue, 22 Jan 2008 12:16:10 +0100
Andrew,

please commit this in small pieces using 'git add -i'
and check with 'git diff --cached' what is selected for the next
commit.

metze
>> ------------------------------------------------------------------------
>>
>> diff --git a/source/dsdb/repl/replicated_objects.c 
>> b/source/dsdb/repl/replicated_objects.c
>> index 8aff134..552d83f 100644
>> --- a/source/dsdb/repl/replicated_objects.c
>> +++ b/source/dsdb/repl/replicated_objects.c
>> @@ -400,8 +400,8 @@ WERROR dsdb_extended_replicated_objects_commit(struct 
>> ldb_context *ldb,
>>  
>>      ret = ldb_extended(ldb, DSDB_EXTENDED_REPLICATED_OBJECTS_OID, out, 
>> &ext_res);
>>      if (ret != LDB_SUCCESS) {
>> -            DEBUG(0,("Failed to apply records: %d: %s\n",
>> -                    ret, ldb_strerror(ret)));
>> +            DEBUG(0,("Failed to apply records: %s: %s\n",
>> +                     ldb_errstring(ldb), ldb_strerror(ret)));
>>              talloc_free(out);
>>              return WERR_FOOBAR;
>>      }

please commit this in a single commit.

>> diff --git a/source/dsdb/samdb/ldb_modules/partition.c 
>> b/source/dsdb/samdb/ldb_modules/partition.c
>> index 61b6444..40511a9 100644
>> --- a/source/dsdb/samdb/ldb_modules/partition.c
>> +++ b/source/dsdb/samdb/ldb_modules/partition.c
>> @@ -303,10 +303,19 @@ static int partition_replicate(struct ldb_module 
>> *module, struct ldb_request *re
>>               * if we haven't found a matching partition
>>               * pass the request to the main ldb
>>               *
>> -             * TODO: we should maybe return an error here
>> -             *       if it's not a special dn
>>               */
>>  
>> +            if (!ldb_dn_is_special(dn)) {
>> +                    /* TODO: 
>> +                       We should change this to a referral, 
>> +                       based on pulling the DN apart, in future 
>> +                    */
>> +                    ldb_asprintf_errstring(module->ldb, 
>> +                                           "partition_replicate: "
>> +                                           "Operation on DN %s invalid, not 
>> a partition", 
>> +                                           ldb_dn_get_linearized(dn));
>> +                    return LDB_ERR_NO_SUCH_OBJECT;
>> +            }
>>              return ldb_next_request(module, req);
>>      }

This should also be a small commit.

>> @@ -678,7 +687,6 @@ static int partition_sequence_number(struct ldb_module 
>> *module, struct ldb_reque
>>  static int partition_extended_replicated_objects(struct ldb_module *module, 
>> struct ldb_request *req)
>>  {
>>      struct dsdb_extended_replicated_objects *ext;
>> -
>>      ext = talloc_get_type(req->op.extended.data, struct 
>> dsdb_extended_replicated_objects);
>>      if (!ext) {
>>              ldb_debug(module->ldb, LDB_DEBUG_FATAL, 
>> "partition_extended_replicated_objects: invalid extended data\n");
>> @@ -692,6 +700,7 @@ static int partition_extended_replicated_objects(struct 
>> ldb_module *module, stru
>>      }
>>  
>>      return partition_replicate(module, req, ext->partition_dn);
>> +
>>  }
>>  
>>  /* extended */

please drop this reformatting.

>> diff --git a/source/dsdb/samdb/ldb_modules/repl_meta_data.c 
>> b/source/dsdb/samdb/ldb_modules/repl_meta_data.c
>> index 5a3cc4b..a21cf25 100644
>> --- a/source/dsdb/samdb/ldb_modules/repl_meta_data.c
>> +++ b/source/dsdb/samdb/ldb_modules/repl_meta_data.c
>> @@ -240,12 +240,9 @@ static int replmd_prepare_originating(struct ldb_module 
>> *module, struct ldb_requ
>>                                    struct ldb_dn *dn, const char *fn_name,
>>                                    int (*fn)(struct ldb_module *,
>>                                              struct ldb_request *,
>> -                                            const struct dsdb_schema *,
>> -                                            const struct 
>> dsdb_control_current_partition *))
>> +                                            const struct dsdb_schema *))
>>  {
>>      const struct dsdb_schema *schema;
>> -    const struct ldb_control *partition_ctrl;
>> -    const struct dsdb_control_current_partition *partition;
>>   
>>      /* do not manipulate our control entries */
>>      if (ldb_dn_is_special(dn)) {
>> @@ -260,46 +257,16 @@ static int replmd_prepare_originating(struct 
>> ldb_module *module, struct ldb_requ
>>              return LDB_ERR_CONSTRAINT_VIOLATION;
>>      }
>>  
>> -    partition_ctrl = ldb_request_get_control(req, 
>> DSDB_CONTROL_CURRENT_PARTITION_OID);
>> -    if (!partition_ctrl) {
>> -            ldb_debug_set(module->ldb, LDB_DEBUG_FATAL,
>> -                          "%s: no current partition control found",
>> -                          fn_name);
>> -            return LDB_ERR_CONSTRAINT_VIOLATION;
>> -    }
>> -
>> -    partition = talloc_get_type(partition_ctrl->data,
>> -                                struct dsdb_control_current_partition);
>> -    if (!partition) {
>> -            ldb_debug_set(module->ldb, LDB_DEBUG_FATAL,
>> -                          "%s: current partition control contains invalid 
>> data",
>> -                          fn_name);
>> -            return LDB_ERR_CONSTRAINT_VIOLATION;
>> -    }
>> -
>> -    if (partition->version != DSDB_CONTROL_CURRENT_PARTITION_VERSION) {
>> -            ldb_debug_set(module->ldb, LDB_DEBUG_FATAL,
>> -                          "%s: current partition control contains invalid 
>> version [%u != %u]\n",
>> -                          fn_name, partition->version, 
>> DSDB_CONTROL_CURRENT_PARTITION_VERSION);
>> -            return LDB_ERR_CONSTRAINT_VIOLATION;
>> -    }
>> -
>> -    return fn(module, req, schema, partition);
>> +    return fn(module, req, schema);
>>  }
>>  
>>  static int replmd_add_originating(struct ldb_module *module,
>>                                struct ldb_request *req,
>> -                              const struct dsdb_schema *schema,
>> -                              const struct dsdb_control_current_partition 
>> *partition)
>> +                              const struct dsdb_schema *schema)
>>  {
>>      enum ndr_err_code ndr_err;
>>      struct ldb_request *down_req;
>>      struct ldb_message *msg;
>> -    uint32_t instance_type;
>> -    struct ldb_dn *new_dn;
>> -    const char *rdn_name;
>> -    const char *rdn_name_upper;
>> -    const struct ldb_val *rdn_value = NULL;
>>      const struct dsdb_attribute *rdn_attr = NULL;
>>      struct GUID guid;
>>      struct ldb_val guid_value;
>> @@ -321,12 +288,6 @@ static int replmd_add_originating(struct ldb_module 
>> *module,
>>              return LDB_ERR_UNWILLING_TO_PERFORM;
>>      }
>>  
>> -    if (ldb_msg_find_element(req->op.add.message, "instanceType")) {
>> -            ldb_debug_set(module->ldb, LDB_DEBUG_ERROR,
>> -                          "replmd_add_originating: it's not allowed to add 
>> an object with instanceType\n");
>> -            return LDB_ERR_UNWILLING_TO_PERFORM;
>> -    }
>> -
>>      /* Get a sequence number from the backend */
>>      ret = ldb_sequence_number(module->ldb, LDB_SEQ_NEXT, &seq_num);
>>      if (ret != LDB_SUCCESS) {
>> @@ -368,32 +329,9 @@ static int replmd_add_originating(struct ldb_module 
>> *module,
>>              return LDB_ERR_OPERATIONS_ERROR;
>>      }
>>  
>> -    /*
>> -     * get details of the rdn name
>> -     */
>> -    rdn_name        = ldb_dn_get_rdn_name(msg->dn);
>> -    if (!rdn_name) {
>> -            talloc_free(down_req);
>> -            ldb_oom(module->ldb);
>> -            return LDB_ERR_OPERATIONS_ERROR;
>> -    }
>> -    rdn_attr        = dsdb_attribute_by_lDAPDisplayName(schema, rdn_name);
>> -    if (!rdn_attr) {
>> -            talloc_free(down_req);
>> -            return LDB_ERR_OPERATIONS_ERROR;
>> -    }
>> -    rdn_value       = ldb_dn_get_rdn_val(msg->dn);
>> -    if (!rdn_value) {
>> -            talloc_free(down_req);
>> -            ldb_oom(module->ldb);
>> -            return LDB_ERR_OPERATIONS_ERROR;
>> -    }
>> -
>>      /* 
>>       * remove autogenerated attributes
>>       */
>> -    ldb_msg_remove_attr(msg, rdn_name);
>> -    ldb_msg_remove_attr(msg, "name");
>>      ldb_msg_remove_attr(msg, "whenCreated");
>>      ldb_msg_remove_attr(msg, "whenChanged");
>>      ldb_msg_remove_attr(msg, "uSNCreated");
>> @@ -401,69 +339,14 @@ static int replmd_add_originating(struct ldb_module 
>> *module,
>>      ldb_msg_remove_attr(msg, "replPropertyMetaData");
>>  
>>      /*
>> -     * TODO: construct a new DN out of:
>> -     *       - the parent DN
>> -     *       - the upper case of rdn_attr->LDAPDisplayName
>> -     *       - rdn_value
>> -     */
>> -    new_dn = ldb_dn_copy(msg, msg->dn);
>> -    if (!new_dn) {
>> -            talloc_free(down_req);
>> -            ldb_oom(module->ldb);
>> -            return LDB_ERR_OPERATIONS_ERROR;
>> -    }
>> -    rdn_name_upper = strupper_talloc(msg, rdn_attr->lDAPDisplayName);
>> -    if (!rdn_name_upper) {
>> -            talloc_free(down_req);
>> -            ldb_oom(module->ldb);
>> -            return LDB_ERR_OPERATIONS_ERROR;
>> -    }
>> -    ret = ldb_dn_set_component(new_dn, 0, rdn_name_upper, *rdn_value);
>> -    if (ret != LDB_SUCCESS) {
>> -            talloc_free(down_req);
>> -            ldb_oom(module->ldb);
>> -            return LDB_ERR_OPERATIONS_ERROR;
>> -    }
>> -    msg->dn = new_dn;
>> -
>> -    /*
>> -     * TODO: calculate correct instance type
>> -     */
>> -    instance_type = INSTANCE_TYPE_WRITE;
>> -    if (ldb_dn_compare(partition->dn, msg->dn) == 0) {
>> -            instance_type |= INSTANCE_TYPE_IS_NC_HEAD;
>> -            if (ldb_dn_compare(msg->dn, samdb_base_dn(module->ldb)) != 0) {
>> -                    instance_type |= INSTANCE_TYPE_NC_ABOVE;
>> -            }
>> -    }
>> -
>> -    /*
>>       * readd replicated attributes
>>       */
>> -    ret = ldb_msg_add_value(msg, rdn_attr->lDAPDisplayName, rdn_value, 
>> NULL);
>> -    if (ret != LDB_SUCCESS) {
>> -            talloc_free(down_req);
>> -            ldb_oom(module->ldb);
>> -            return LDB_ERR_OPERATIONS_ERROR;
>> -    }
>> -    ret = ldb_msg_add_value(msg, "name", rdn_value, NULL);
>> -    if (ret != LDB_SUCCESS) {
>> -            talloc_free(down_req);
>> -            ldb_oom(module->ldb);
>> -            return LDB_ERR_OPERATIONS_ERROR;
>> -    }
>>      ret = ldb_msg_add_string(msg, "whenCreated", time_str);
>>      if (ret != LDB_SUCCESS) {
>>              talloc_free(down_req);
>>              ldb_oom(module->ldb);
>>              return LDB_ERR_OPERATIONS_ERROR;
>>      }
>> -    ret = ldb_msg_add_fmt(msg, "instanceType", "%u", instance_type);
>> -    if (ret != LDB_SUCCESS) {
>> -            talloc_free(down_req);
>> -            ldb_oom(module->ldb);
>> -            return LDB_ERR_OPERATIONS_ERROR;
>> -    }
>>  
>>      /* build the replication meta_data */
>>      ZERO_STRUCT(nmd);
>> @@ -598,8 +481,7 @@ static int replmd_add(struct ldb_module *module, struct 
>> ldb_request *req)
>>  
>>  static int replmd_modify_originating(struct ldb_module *module,
>>                                   struct ldb_request *req,
>> -                                 const struct dsdb_schema *schema,
>> -                                 const struct 
>> dsdb_control_current_partition *partition)
>> +                                 const struct dsdb_schema *schema)
>>  {
>>      struct ldb_request *down_req;
>>      struct ldb_message *msg;
>> @@ -806,10 +688,16 @@ static int replmd_replicated_apply_add(struct 
>> replmd_replicated_request *ar)
>>      return ldb_next_request(ar->module, ar->sub.change_req);
>>  #else
>>      ret = ldb_next_request(ar->module, ar->sub.change_req);
>> -    if (ret != LDB_SUCCESS) return replmd_replicated_request_error(ar, ret);
>> +    if (ret != LDB_SUCCESS) {
>> +            ldb_asprintf_errstring(ar->module->ldb, "Failed to add 
>> replicated object %s: %s", 
>> ldb_dn_get_linearized(ar->sub.change_req->op.add.message->dn), 
>> +                                   ldb_errstring(ar->module->ldb));
>> +            return replmd_replicated_request_error(ar, ret);
>> +    }
>>  
>> -    ar->sub.change_ret = ldb_wait(ar->sub.search_req->handle, LDB_WAIT_ALL);
>> +    ar->sub.change_ret = ldb_wait(ar->sub.change_req->handle, LDB_WAIT_ALL);
>>      if (ar->sub.change_ret != LDB_SUCCESS) {
>> +            ldb_asprintf_errstring(ar->module->ldb, "Failed while waiting 
>> on add replicated object %s: %s", 
>> ldb_dn_get_linearized(ar->sub.change_req->op.add.message->dn), 
>> +                                   ldb_errstring(ar->module->ldb));
>>              return replmd_replicated_request_error(ar, ar->sub.change_ret);
>>      }
>>  
>> @@ -1053,7 +941,7 @@ static int replmd_replicated_apply_merge(struct 
>> replmd_replicated_request *ar)
>>      ret = ldb_next_request(ar->module, ar->sub.change_req);
>>      if (ret != LDB_SUCCESS) return replmd_replicated_request_error(ar, ret);
>>  
>> -    ar->sub.change_ret = ldb_wait(ar->sub.search_req->handle, LDB_WAIT_ALL);
>> +    ar->sub.change_ret = ldb_wait(ar->sub.change_req->handle, LDB_WAIT_ALL);
>>      if (ar->sub.change_ret != LDB_SUCCESS) {
>>              return replmd_replicated_request_error(ar, ar->sub.change_ret);
>>      }
>> @@ -1137,7 +1025,7 @@ static int replmd_replicated_apply_search(struct 
>> replmd_replicated_request *ar)
>>      if (ret != LDB_SUCCESS) return replmd_replicated_request_error(ar, ret);
>>  
>>      ar->sub.search_ret = ldb_wait(ar->sub.search_req->handle, LDB_WAIT_ALL);
>> -    if (ar->sub.search_ret != LDB_SUCCESS) {
>> +    if (ar->sub.search_ret != LDB_SUCCESS && ar->sub.search_ret != 
>> LDB_ERR_NO_SUCH_OBJECT) {
>>              return replmd_replicated_request_error(ar, ar->sub.search_ret);
>>      }
>>      if (ar->sub.search_msg) {

The above looks ok.

>> diff --git a/source/dsdb/schema/schema_syntax.c 
>> b/source/dsdb/schema/schema_syntax.c
>> index 9bc51c6..2c133b6 100644
>> --- a/source/dsdb/schema/schema_syntax.c
>> +++ b/source/dsdb/schema/schema_syntax.c
>> @@ -939,7 +939,7 @@ static WERROR dsdb_syntax_DN_BINARY_drsuapi_to_ldb(const 
>> struct dsdb_schema *sch
>>              }
>>  
>>              ndr_err = ndr_pull_struct_blob_all(in->value_ctr.values[i].blob,
>> -                                               out->values, NULL, &id3b,
>> +                                               out->values, 
>> lp_iconv_convenience(global_loadparm), &id3b,
>>                                                 
>> (ndr_pull_flags_fn_t)ndr_pull_drsuapi_DsReplicaObjectIdentifier3Binary);
>>              if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
>>                      NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
>> @@ -997,7 +997,7 @@ static WERROR dsdb_syntax_DN_BINARY_ldb_to_drsuapi(const 
>> struct dsdb_schema *sch
>>              id3b.dn         = (const char *)in->values[i].data;
>>              id3b.binary     = data_blob(NULL, 0);
>>  
>> -            ndr_err = ndr_push_struct_blob(&blobs[i], blobs, NULL, &id3b,
>> +            ndr_err = ndr_push_struct_blob(&blobs[i], blobs, 
>> lp_iconv_convenience(global_loadparm), &id3b,
>>                                             
>> (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3Binary);
>>              if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
>>                      NTSTATUS status = ndr_map_error2ntstatus(ndr_err);

Here also an extra commit.

>> diff --git a/source/heimdal/lib/asn1/lex.c b/source/heimdal/lib/asn1/lex.c
>> index 86c4359..6a3a49c 100644
>> --- a/source/heimdal/lib/asn1/lex.c
>> +++ b/source/heimdal/lib/asn1/lex.c
>> @@ -1907,7 +1907,7 @@ static int yy_get_next_buffer (void)
>>  
>>              /* Read in more data. */
>>              YY_INPUT( 
>> (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]),
>> -                    (yy_n_chars), (size_t) num_to_read );
>> +                    (yy_n_chars), num_to_read );
>>  
>>              YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars);
>>              }
>> @@ -2408,7 +2408,7 @@ YY_BUFFER_STATE yy_scan_buffer  (char * base, 
>> yy_size_t  size )
>>  
>>  /** Setup the input buffer state to scan a string. The next call to yylex() 
>> will
>>   * scan from a @e copy of @a str.
>> - * @param yystr a NUL-terminated string to scan
>> + * @param str a NUL-terminated string to scan
>>   * 
>>   * @return the newly allocated buffer state object.
>>   * @note If you want to scan bytes that may contain NUL values, then use

please skip this reformatting.

>> diff --git a/source/lib/ldb/common/ldb.c b/source/lib/ldb/common/ldb.c
>> index 87f791c..5601a33 100644
>> --- a/source/lib/ldb/common/ldb.c
>> +++ b/source/lib/ldb/common/ldb.c
>> @@ -463,11 +463,17 @@ static int ldb_autotransaction_request(struct 
>> ldb_context *ldb, struct ldb_reque
>>  
>>  int ldb_wait(struct ldb_handle *handle, enum ldb_wait_type type)
>>  {
>> +    int ret;
>>      if (!handle) {
>>              return LDB_SUCCESS;
>>      }
>>  
>> -    return handle->module->ops->wait(handle, type);
>> +    ret = handle->module->ops->wait(handle, type);
>> +    if (!ldb_errstring(handle->module->ldb)) {
>> +            /* Set a default error string, to place the blame somewhere */
>> +            ldb_asprintf_errstring(handle->module->ldb, "error waiting on 
>> module %s: %s (%d)", handle->module->ops->name, ldb_strerror(ret), ret);
>> +    }
>> +    return ret;
>>  }
>>  
>>  /* set the specified timeout or, if timeout is 0 set the default timeout */

also an extra commit please.

>> diff --git a/source/libnet/libnet_become_dc.c 
>> b/source/libnet/libnet_become_dc.c
>> index 862631f..c9185c7 100644
>> --- a/source/libnet/libnet_become_dc.c
>> +++ b/source/libnet/libnet_become_dc.c
>> @@ -1514,10 +1514,10 @@ static void becomeDC_drsuapi_connect_send(struct 
>> libnet_BecomeDC_state *s,
>>  
>>      if (!drsuapi->binding) {
>>              if (lp_parm_bool(s->libnet->lp_ctx, NULL, "become_dc", "print", 
>> false)) {
>> -                    binding_str = talloc_asprintf(s, 
>> "ncacn_ip_tcp:%s[krb5,print,seal]", s->source_dsa.dns_name);
>> +                    binding_str = talloc_asprintf(s, 
>> "ncacn_ip_tcp:%s[print,seal]", s->source_dsa.dns_name);
>>                      if (composite_nomem(binding_str, c)) return;
>>              } else {
>> -                    binding_str = talloc_asprintf(s, 
>> "ncacn_ip_tcp:%s[krb5,seal]", s->source_dsa.dns_name);
>> +                    binding_str = talloc_asprintf(s, 
>> "ncacn_ip_tcp:%s[seal]", s->source_dsa.dns_name);
>>                      if (composite_nomem(binding_str, c)) return;
>>              }
>>              c->status = dcerpc_parse_binding(s, binding_str, 
>> &drsuapi->binding);

Is this change really needed?
We should really use krb5.

>> @@ -1687,6 +1687,7 @@ static void becomeDC_drsuapi1_add_entry_send(struct 
>> libnet_BecomeDC_state *s)
>>      struct drsuapi_DsReplicaObjectIdentifier *identifier;
>>      uint32_t num_attrs, i = 0;
>>      struct drsuapi_DsReplicaAttribute *attrs;
>> +    struct smb_iconv_convenience *iconv_convenience = 
>> lp_iconv_convenience(s->libnet->lp_ctx);
>>      enum ndr_err_code ndr_err;
>>      bool w2k3;
>>  
>> @@ -1785,7 +1786,7 @@ static void becomeDC_drsuapi1_add_entry_send(struct 
>> libnet_BecomeDC_state *s)
>>                                             NULL);
>>              if (composite_nomem(v, c)) return;
>>  
>> -            ndr_err = ndr_push_struct_blob(&vd[0], vd, NULL, 
>> v,(ndr_push_flags_fn_t)ndr_push_security_descriptor);
>> +            ndr_err = ndr_push_struct_blob(&vd[0], vd, iconv_convenience, 
>> v,(ndr_push_flags_fn_t)ndr_push_security_descriptor);
>>              if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
>>                      c->status = ndr_map_error2ntstatus(ndr_err);
>>                      if (!composite_is_ok(c)) return;
>> @@ -1844,7 +1845,7 @@ static void becomeDC_drsuapi1_add_entry_send(struct 
>> libnet_BecomeDC_state *s)
>>                                                        
>> s->forest.schema_dn_str);
>>              if (composite_nomem(v[0].dn, c)) return;
>>  
>> -            ndr_err = ndr_push_struct_blob(&vd[0], vd, NULL, &v[0], 
>> +            ndr_err = ndr_push_struct_blob(&vd[0], vd, iconv_convenience, 
>> &v[0], 
>>                                             
>> (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
>>              if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
>>                      c->status = ndr_map_error2ntstatus(ndr_err);
>> @@ -1874,7 +1875,7 @@ static void becomeDC_drsuapi1_add_entry_send(struct 
>> libnet_BecomeDC_state *s)
>>  
>>              v = &s->dest_dsa.invocation_id;
>>  
>> -            ndr_err = ndr_push_struct_blob(&vd[0], vd, NULL, v, 
>> (ndr_push_flags_fn_t)ndr_push_GUID);
>> +            ndr_err = ndr_push_struct_blob(&vd[0], vd, iconv_convenience, 
>> v, (ndr_push_flags_fn_t)ndr_push_GUID);
>>              if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
>>                      c->status = ndr_map_error2ntstatus(ndr_err);
>>                      if (!composite_is_ok(c)) return;
>> @@ -1913,21 +1914,21 @@ static void becomeDC_drsuapi1_add_entry_send(struct 
>> libnet_BecomeDC_state *s)
>>              v[2].sid                = s->zero_sid;
>>              v[2].dn                 = s->forest.schema_dn_str;
>>  
>> -            ndr_err = ndr_push_struct_blob(&vd[0], vd, NULL, &v[0],
>> +            ndr_err = ndr_push_struct_blob(&vd[0], vd, iconv_convenience, 
>> &v[0],
>>                                             
>> (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
>>              if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
>>                      c->status = ndr_map_error2ntstatus(ndr_err);
>>                      if (!composite_is_ok(c)) return;
>>              }
>>  
>> -            ndr_err = ndr_push_struct_blob(&vd[1], vd, NULL, &v[1],
>> +            ndr_err = ndr_push_struct_blob(&vd[1], vd, iconv_convenience, 
>> &v[1],
>>                                             
>> (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
>>              if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
>>                      c->status = ndr_map_error2ntstatus(ndr_err);
>>                      if (!composite_is_ok(c)) return;
>>              }
>>  
>> -            ndr_err = ndr_push_struct_blob(&vd[2], vd, NULL, &v[2],
>> +            ndr_err = ndr_push_struct_blob(&vd[2], vd, iconv_convenience, 
>> &v[2],
>>                                             
>> (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
>>              if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
>>                      c->status = ndr_map_error2ntstatus(ndr_err);
>> @@ -1969,21 +1970,21 @@ static void becomeDC_drsuapi1_add_entry_send(struct 
>> libnet_BecomeDC_state *s)
>>              v[2].sid                = s->zero_sid;
>>              v[2].dn                 = s->forest.schema_dn_str;
>>  
>> -            ndr_err = ndr_push_struct_blob(&vd[0], vd, NULL, &v[0],
>> +            ndr_err = ndr_push_struct_blob(&vd[0], vd, iconv_convenience, 
>> &v[0],
>>                                             
>> (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
>>              if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
>>                      c->status = ndr_map_error2ntstatus(ndr_err);
>>                      if (!composite_is_ok(c)) return;
>>              }
>>  
>> -            ndr_err = ndr_push_struct_blob(&vd[1], vd, NULL, &v[1],
>> +            ndr_err = ndr_push_struct_blob(&vd[1], vd, iconv_convenience, 
>> &v[1],
>>                                             
>> (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
>>              if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
>>                      c->status = ndr_map_error2ntstatus(ndr_err);
>>                      if (!composite_is_ok(c)) return;
>>              }
>>  
>> -            ndr_err = ndr_push_struct_blob(&vd[2], vd, NULL, &v[2],
>> +            ndr_err = ndr_push_struct_blob(&vd[2], vd, iconv_convenience, 
>> &v[2],
>>                                             
>> (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
>>              if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
>>                      c->status = ndr_map_error2ntstatus(ndr_err);
>> @@ -2017,7 +2018,7 @@ static void becomeDC_drsuapi1_add_entry_send(struct 
>> libnet_BecomeDC_state *s)
>>              v[0].sid                = s->zero_sid;
>>              v[0].dn                 = s->forest.schema_dn_str;
>>  
>> -            ndr_err = ndr_push_struct_blob(&vd[0], vd, NULL, &v[0],
>> +            ndr_err = ndr_push_struct_blob(&vd[0], vd, iconv_convenience, 
>> &v[0],
>>                                             
>> (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
>>              if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
>>                      c->status = ndr_map_error2ntstatus(ndr_err);
>> @@ -2049,7 +2050,7 @@ static void becomeDC_drsuapi1_add_entry_send(struct 
>> libnet_BecomeDC_state *s)
>>              v[0].sid                = s->zero_sid;
>>              v[0].dn                 = s->domain.dn_str;
>>  
>> -            ndr_err = ndr_push_struct_blob(&vd[0], vd, NULL, &v[0],
>> +            ndr_err = ndr_push_struct_blob(&vd[0], vd, iconv_convenience, 
>> &v[0],
>>                                             
>> (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
>>              if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
>>                      c->status = ndr_map_error2ntstatus(ndr_err);
>> @@ -2131,7 +2132,7 @@ static void becomeDC_drsuapi1_add_entry_send(struct 
>> libnet_BecomeDC_state *s)
>>              v[0].sid                = s->zero_sid;
>>              v[0].dn                 = s->dest_dsa.computer_dn_str;
>>  
>> -            ndr_err = ndr_push_struct_blob(&vd[0], vd, NULL, &v[0],
>> +            ndr_err = ndr_push_struct_blob(&vd[0], vd, iconv_convenience, 
>> &v[0],
>>                                             
>> (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
>>              if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
>>                      c->status = ndr_map_error2ntstatus(ndr_err);

This should also be its own commit.

>> diff --git a/source/selftest/target/Samba4.pm 
>> b/source/selftest/target/Samba4.pm
>> index 87a86ef..4a827cc 100644
>> --- a/source/selftest/target/Samba4.pm
>> +++ b/source/selftest/target/Samba4.pm
>> @@ -670,7 +670,7 @@ nogroup:x:65534:nobody
>>      push (@provision_options, split(' ', $configuration));
>>      push (@provision_options, "--host-name=$netbiosname");
>>      push (@provision_options, "--host-ip=$ifaceipv4");
>> -    push (@provision_options, "--quiet");
>> +#   push (@provision_options, "--quiet");
>>      push (@provision_options, "--domain=$domain");
>>      push (@provision_options, "--realm=$realm");
>>      push (@provision_options, "--adminpass=$password");

please remove this.

>> diff --git a/source/torture/libnet/libnet_BecomeDC.c 
>> b/source/torture/libnet/libnet_BecomeDC.c
>> index 10625b2..932498a 100644
>> --- a/source/torture/libnet/libnet_BecomeDC.c
>> +++ b/source/torture/libnet/libnet_BecomeDC.c
>> @@ -60,7 +60,9 @@ struct test_become_dc_state {
>>              const char *configdn_ldb;
>>              const char *schemadn_ldb;
>>              const char *secrets_ldb;
>> +            const char *templates_ldb;
>>              const char *secrets_keytab;
>> +            const char *dns_keytab;
>>      } path;
>>  };
>>  
>> @@ -195,25 +197,13 @@ static NTSTATUS test_become_dc_prepare_db(void 
>> *private_data,
>>              "subobj.SCHEMADN     = \"%s\";\n"
>>              "subobj.SCHEMADN_LDB = \"%s\";\n"
>>              "subobj.HOSTNAME     = \"%s\";\n"
>> -            "subobj.DNSNAME      = \"%s\";\n"
>> +            "subobj.REALM        = \"%s\";\n"
>> +            "subobj.DOMAIN       = \"%s\";\n"
>>              "subobj.DEFAULTSITE  = \"%s\";\n"
>>              "\n"
>> -            "modules_list        = new Array(\"rootdse\",\n"
>> -            "                                \"kludge_acl\",\n"
>> -            "                                \"paged_results\",\n"
>> -            "                                \"server_sort\",\n"
>> -            "                                \"extended_dn\",\n"
>> -            "                                \"asq\",\n"
>> -            "                                \"samldb\",\n"
>> -            "                                \"operational\",\n"
>> -            "                                \"objectclass\",\n"
>> -            "                                \"rdn_name\",\n"
>> -            "                                \"show_deleted\",\n"
>> -            "                                \"partition\");\n"
>> -            "subobj.MODULES_LIST = join(\",\", modules_list);\n"
>> -            "subobj.DOMAINDN_MOD = 
>> \"pdc_fsmo,password_hash,repl_meta_data\";\n"
>> -            "subobj.CONFIGDN_MOD = \"naming_fsmo,repl_meta_data\";\n"
>> -            "subobj.SCHEMADN_MOD = \"schema_fsmo,repl_meta_data\";\n"
>> +            "subobj.DOMAINDN_MOD2 = \",repl_meta_data\";\n"
>> +            "subobj.CONFIGDN_MOD2 = \",repl_meta_data\";\n"
>> +            "subobj.SCHEMADN_MOD2 = \",repl_meta_data\";\n"
>>              "\n"
>>              "subobj.KRBTGTPASS   = \"_NOT_USED_\";\n"
>>              "subobj.MACHINEPASS  = \"%s\";\n"
>> @@ -222,7 +212,9 @@ static NTSTATUS test_become_dc_prepare_db(void 
>> *private_data,
>>              "var paths = provision_default_paths(subobj);\n"
>>              "paths.samdb = \"%s\";\n"
>>              "paths.secrets = \"%s\";\n"
>> +            "paths.templates = \"%s\";\n"
>>              "paths.keytab = \"%s\";\n"
>> +            "paths.dns_keytab = \"%s\";\n"
>>              "\n"
>>              "var system_session = system_session();\n"
>>              "\n"
>> @@ -238,12 +230,15 @@ static NTSTATUS test_become_dc_prepare_db(void 
>> *private_data,
>>              p->forest->schema_dn_str,       /* subobj.SCHEMADN */
>>              s->path.schemadn_ldb,           /* subobj.SCHEMADN_LDB */
>>              p->dest_dsa->netbios_name,      /* subobj.HOSTNAME */
>> -            p->dest_dsa->dns_name,          /* subobj.DNSNAME */
>> +            torture_join_dom_dns_name(s->tj),/* subobj.REALM */
>> +            torture_join_dom_netbios_name(s->tj),/* subobj.DOMAIN */
>>              p->dest_dsa->site_name,         /* subobj.DEFAULTSITE */
>>              cli_credentials_get_password(s->machine_account),/* 
>> subobj.MACHINEPASS */
>>              s->path.samdb_ldb,              /* paths.samdb */
>> +            s->path.templates_ldb,          /* paths.templates */
>>              s->path.secrets_ldb,            /* paths.secrets */
>> -            s->path.secrets_keytab);        /* paths.keytab */
>> +            s->path.secrets_keytab,         /* paths.keytab */
>> +            s->path.dns_keytab);            /* paths.dns_keytab */
>>      NT_STATUS_HAVE_NO_MEMORY(ejs);
>>  
>>      ret = test_run_ejs(ejs);
>> @@ -854,8 +849,12 @@ bool torture_net_become_dc(struct torture_context 
>> *torture)
>>      if (!s->path.schemadn_ldb) return false;
>>      s->path.secrets_ldb     = talloc_asprintf(s, "%s_secrets.ldb", 
>> s->netbios_name);
>>      if (!s->path.secrets_ldb) return false;
>> +    s->path.templates_ldb   = talloc_asprintf(s, "%s_templates.ldb", 
>> s->netbios_name);
>> +    if (!s->path.templates_ldb) return false;
>>      s->path.secrets_keytab  = talloc_asprintf(s, "%s_secrets.keytab", 
>> s->netbios_name);
>>      if (!s->path.secrets_keytab) return false;
>> +    s->path.dns_keytab      = talloc_asprintf(s, "%s_dns.keytab", 
>> s->netbios_name);
>> +    if (!s->path.dns_keytab) return false;
>>  
>>      /* Join domain as a member server. */
>>      s->tj = torture_join_domain(torture, s->netbios_name,

The rest looks also good.

<Prev in Thread] Current Thread [Next in Thread>