s4-dsdb: ensure rIDSetReferences is stored as an extended DN
authorAndrew Tridgell <tridge@samba.org>
Tue, 9 Aug 2011 03:18:08 +0000 (13:18 +1000)
committerAndrew Bartlett <abartlet@samba.org>
Tue, 9 Aug 2011 09:56:23 +0000 (11:56 +0200)
Signed-off-by: Andrew Bartlett <abartlet@samba.org>
source4/dsdb/samdb/ldb_modules/ridalloc.c
source4/dsdb/samdb/ldb_modules/util.c

index 28fade11b12fb48d79c8d094a70f2b4de5df6dda..ed87f86fa24ab8850718d934283f30275fe3176d 100644 (file)
@@ -263,6 +263,8 @@ static int ridalloc_create_rid_set_ntds(struct ldb_module *module, TALLOC_CTX *m
                .next_rid       = 0,
                .used_pool      = 0,
        };
+       const char *no_attrs[] = { NULL };
+       struct ldb_result *res;
 
        /*
          steps:
@@ -339,7 +341,21 @@ static int ridalloc_create_rid_set_ntds(struct ldb_module *module, TALLOC_CTX *m
        msg = ldb_msg_new(tmp_ctx);
        msg->dn = machine_dn;
 
-       ret = ldb_msg_add_string(msg, "rIDSetReferences", ldb_dn_get_linearized(rid_set_dn));
+       /* we need the extended DN of the RID Set object for
+        * rIDSetReferences */
+       ret = dsdb_module_search_dn(module, msg, &res, rid_set_dn, no_attrs,
+                                   DSDB_FLAG_NEXT_MODULE | DSDB_SEARCH_SHOW_DN_IN_STORAGE_FORMAT, parent);
+       if (ret != LDB_SUCCESS) {
+               ldb_asprintf_errstring(ldb, "Failed to find extended DN of RID Set %s - %s",
+                                      ldb_dn_get_linearized(msg->dn),
+                                      ldb_errstring(ldb));
+               talloc_free(tmp_ctx);
+               return ret;
+       }
+       rid_set_dn = res->msgs[0]->dn;
+
+
+       ret = ldb_msg_add_string(msg, "rIDSetReferences", ldb_dn_get_extended_linearized(msg, rid_set_dn, 1));
        if (ret != LDB_SUCCESS) {
                talloc_free(tmp_ctx);
                return ret;
index ebb214dff32070511ded36707e2fb90516453f6e..dfb860018788b31701e07f91c482f40ab2096d53 100644 (file)
@@ -751,7 +751,7 @@ int dsdb_module_reference_dn(struct ldb_module *module, TALLOC_CTX *mem_ctx, str
        attrs[1] = NULL;
 
        ret = dsdb_module_search_dn(module, mem_ctx, &res, base, attrs,
-                                   DSDB_FLAG_NEXT_MODULE, parent);
+                                   DSDB_FLAG_NEXT_MODULE | DSDB_SEARCH_SHOW_EXTENDED_DN, parent);
        if (ret != LDB_SUCCESS) {
                return ret;
        }