summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/dsdb/samdb/samdb.c30
-rw-r--r--source4/lib/ldb-samba/ldb_wrap.c122
-rw-r--r--source4/lib/ldb-samba/ldb_wrap.h9
-rw-r--r--source4/smbd/server.c2
4 files changed, 104 insertions, 59 deletions
diff --git a/source4/dsdb/samdb/samdb.c b/source4/dsdb/samdb/samdb.c
index 8b0c0fec3f..c2a1e9ec80 100644
--- a/source4/dsdb/samdb/samdb.c
+++ b/source4/dsdb/samdb/samdb.c
@@ -128,12 +128,27 @@ struct ldb_context *samdb_connect(TALLOC_CTX *mem_ctx,
{
struct ldb_context *ldb;
struct dsdb_schema *schema;
- ldb = ldb_wrap_connect(mem_ctx, ev_ctx, lp_ctx,
- lpcfg_sam_url(lp_ctx), session_info,
- samdb_credentials(ev_ctx, lp_ctx),
- flags);
+ const char *url;
+ struct cli_credentials *credentials;
+ int ret;
- if (!ldb) {
+ url = lpcfg_sam_url(lp_ctx);
+ credentials = samdb_credentials(ev_ctx, lp_ctx);
+
+ ldb = ldb_wrap_find(url, ev_ctx, lp_ctx, session_info, credentials, flags);
+ if (ldb != NULL)
+ return talloc_reference(mem_ctx, ldb);
+
+ ldb = samba_ldb_init(mem_ctx, ev_ctx, lp_ctx, session_info, credentials);
+
+ if (ldb == NULL)
+ return NULL;
+
+ dsdb_set_global_schema(ldb);
+
+ ret = samba_ldb_connect(ldb, lp_ctx, url, flags);
+ if (ret != LDB_SUCCESS) {
+ talloc_free(ldb);
return NULL;
}
@@ -143,6 +158,11 @@ struct ldb_context *samdb_connect(TALLOC_CTX *mem_ctx,
dsdb_make_schema_global(ldb, schema);
}
+ if (!ldb_wrap_add(url, ev_ctx, lp_ctx, session_info, credentials, flags, ldb)) {
+ talloc_free(ldb);
+ return NULL;
+ }
+
return ldb;
}
diff --git a/source4/lib/ldb-samba/ldb_wrap.c b/source4/lib/ldb-samba/ldb_wrap.c
index 5aff11229e..7ac94dea2c 100644
--- a/source4/lib/ldb-samba/ldb_wrap.c
+++ b/source4/lib/ldb-samba/ldb_wrap.c
@@ -107,8 +107,7 @@ static int ldb_wrap_destructor(struct ldb_wrap *w)
struct tevent_context *ev,
struct loadparm_context *lp_ctx,
struct auth_session_info *session_info,
- struct cli_credentials *credentials,
- int flags
+ struct cli_credentials *credentials
)
{
struct ldb_context *ldb;
@@ -164,15 +163,6 @@ static int ldb_wrap_destructor(struct ldb_wrap *w)
return NULL;
}
- /* allow admins to force non-sync ldb for all databases */
- if (lpcfg_parm_bool(lp_ctx, NULL, "ldb", "nosync", false)) {
- flags |= LDB_FLG_NOSYNC;
- }
-
- if (DEBUGLVL(10)) {
- flags |= LDB_FLG_ENABLE_TRACING;
- }
-
/* we usually want Samba databases to be private. If we later
find we need one public, we will need to add a parameter to
ldb_wrap_connect() */
@@ -203,60 +193,51 @@ static int ldb_wrap_destructor(struct ldb_wrap *w)
return NULL;
}
-/*
- wrapped connection to a ldb database
- to close just talloc_free() the returned ldb_context
-
- TODO: We need an error_string parameter
- */
- struct ldb_context *ldb_wrap_connect(TALLOC_CTX *mem_ctx,
- struct tevent_context *ev,
- struct loadparm_context *lp_ctx,
- const char *url,
- struct auth_session_info *session_info,
- struct cli_credentials *credentials,
- unsigned int flags)
+int samba_ldb_connect(struct ldb_context *ldb, struct loadparm_context *lp_ctx, const char *url, int flags)
{
- struct ldb_context *ldb;
int ret;
char *real_url = NULL;
- struct ldb_wrap_context c;
- struct ldb_wrap *w;
-
- ldb = ldb_wrap_find(url, ev, lp_ctx, session_info, credentials, flags);
- if (ldb != NULL)
- return talloc_reference(mem_ctx, ldb);
-
- ldb = samba_ldb_init(mem_ctx, ev, lp_ctx, session_info, credentials, flags);
- if (ldb == NULL)
- return NULL;
+ /* allow admins to force non-sync ldb for all databases */
+ if (lpcfg_parm_bool(lp_ctx, NULL, "ldb", "nosync", false)) {
+ flags |= LDB_FLG_NOSYNC;
+ }
- if (lp_ctx != NULL && strcmp(lpcfg_sam_url(lp_ctx), url) == 0) {
- dsdb_set_global_schema(ldb);
+ if (DEBUGLVL(10)) {
+ flags |= LDB_FLG_ENABLE_TRACING;
}
real_url = private_path(ldb, lp_ctx, url);
if (real_url == NULL) {
- talloc_free(ldb);
- return NULL;
+ return LDB_ERR_OPERATIONS_ERROR;
}
-
ret = ldb_connect(ldb, real_url, flags, NULL);
+
if (ret != LDB_SUCCESS) {
- talloc_free(ldb);
- return NULL;
+ return ret;
}
/* setup for leak detection */
ldb_set_opaque(ldb, "wrap_url", real_url);
-
+
+ return LDB_SUCCESS;
+}
+
+ bool ldb_wrap_add(const char *url, struct tevent_context *ev,
+ struct loadparm_context *lp_ctx,
+ struct auth_session_info *session_info,
+ struct cli_credentials *credentials,
+ int flags,
+ struct ldb_context *ldb)
+{
+ struct ldb_wrap *w;
+ struct ldb_wrap_context c;
+
/* add to the list of open ldb contexts */
w = talloc(ldb, struct ldb_wrap);
if (w == NULL) {
- talloc_free(ldb);
- return NULL;
+ return false;
}
c.url = url;
@@ -269,8 +250,7 @@ static int ldb_wrap_destructor(struct ldb_wrap *w)
w->context = c;
w->context.url = talloc_strdup(w, url);
if (w->context.url == NULL) {
- talloc_free(ldb);
- return NULL;
+ return false;
}
if (session_info) {
@@ -283,8 +263,7 @@ static int ldb_wrap_destructor(struct ldb_wrap *w)
* ldb modules to use
*/
if (talloc_reference(w, session_info) == NULL) {
- talloc_free(ldb);
- return NULL;
+ return false;
}
}
@@ -292,10 +271,51 @@ static int ldb_wrap_destructor(struct ldb_wrap *w)
DLIST_ADD(ldb_wrap_list, w);
- DEBUG(3,("ldb_wrap open of %s\n", url));
-
talloc_set_destructor(w, ldb_wrap_destructor);
+ return true;
+}
+
+
+/*
+ wrapped connection to a ldb database
+ to close just talloc_free() the returned ldb_context
+
+ TODO: We need an error_string parameter
+ */
+ struct ldb_context *ldb_wrap_connect(TALLOC_CTX *mem_ctx,
+ struct tevent_context *ev,
+ struct loadparm_context *lp_ctx,
+ const char *url,
+ struct auth_session_info *session_info,
+ struct cli_credentials *credentials,
+ unsigned int flags)
+{
+ struct ldb_context *ldb;
+ int ret;
+
+ ldb = ldb_wrap_find(url, ev, lp_ctx, session_info, credentials, flags);
+ if (ldb != NULL)
+ return talloc_reference(mem_ctx, ldb);
+
+ ldb = samba_ldb_init(mem_ctx, ev, lp_ctx, session_info, credentials);
+
+ if (ldb == NULL)
+ return NULL;
+
+ ret = samba_ldb_connect(ldb, lp_ctx, url, flags);
+ if (ret != LDB_SUCCESS) {
+ talloc_free(ldb);
+ return NULL;
+ }
+
+ if (!ldb_wrap_add(url, ev, lp_ctx, session_info, credentials, flags, ldb)) {
+ talloc_free(ldb);
+ return NULL;
+ }
+
+ DEBUG(3,("ldb_wrap open of %s\n", url));
+
return ldb;
}
diff --git a/source4/lib/ldb-samba/ldb_wrap.h b/source4/lib/ldb-samba/ldb_wrap.h
index f576802836..a835f665fc 100644
--- a/source4/lib/ldb-samba/ldb_wrap.h
+++ b/source4/lib/ldb-samba/ldb_wrap.h
@@ -47,13 +47,18 @@ struct ldb_context *samba_ldb_init(TALLOC_CTX *mem_ctx,
struct tevent_context *ev,
struct loadparm_context *lp_ctx,
struct auth_session_info *session_info,
- struct cli_credentials *credentials,
- int flags);
+ struct cli_credentials *credentials);
struct ldb_context *ldb_wrap_find(const char *url,
struct tevent_context *ev,
struct loadparm_context *lp_ctx,
struct auth_session_info *session_info,
struct cli_credentials *credentials,
int flags);
+bool ldb_wrap_add(const char *url, struct tevent_context *ev,
+ struct loadparm_context *lp_ctx,
+ struct auth_session_info *session_info,
+ struct cli_credentials *credentials,
+ int flags,
+ struct ldb_context *ldb);
#endif /* _LDB_WRAP_H_ */
diff --git a/source4/smbd/server.c b/source4/smbd/server.c
index 65364556fc..2d837dd1fc 100644
--- a/source4/smbd/server.c
+++ b/source4/smbd/server.c
@@ -191,7 +191,7 @@ static void prime_ldb_databases(struct tevent_context *event_ctx)
TALLOC_CTX *db_context;
db_context = talloc_new(event_ctx);
- samdb_connect(db_context, event_ctx, cmdline_lp_ctx, system_session(cmdline_lp_ctx));
+ samdb_connect(db_context, event_ctx, cmdline_lp_ctx, system_session(cmdline_lp_ctx), 0);
privilege_connect(db_context, event_ctx, cmdline_lp_ctx);
/* we deliberately leave these open, which allows them to be