samdb: Rework samdb_connect_url() to return LDB error code and an error string
authorAndrew Bartlett <abartlet@samba.org>
Thu, 14 Sep 2017 03:02:36 +0000 (15:02 +1200)
committerDouglas Bagnall <dbagnall@samba.org>
Wed, 20 Sep 2017 00:25:30 +0000 (02:25 +0200)
This allows debugging of why the LDB failed to start up.

Signed-off-by: Andrew Bartlett <abartlet@samba.org>
Reviewed-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
source3/passdb/pdb_samba_dsdb.c
source4/dns_server/dlz_bind9.c
source4/dsdb/samdb/samdb.c
source4/torture/dns/dlz_bind9.c

index cfa492b442ab099cbe7f2841c416902ddadba843..58168d843aa13bfeba9d4608c1daa66a20fa978f 100644 (file)
@@ -3023,6 +3023,8 @@ static NTSTATUS pdb_init_samba_dsdb(struct pdb_methods **pdb_method,
        struct pdb_methods *m;
        struct pdb_samba_dsdb_state *state;
        NTSTATUS status;
+       char *errstring = NULL;
+       int ret;
 
        if ( !NT_STATUS_IS_OK(status = make_pdb_method( &m )) ) {
                return status;
@@ -3048,21 +3050,20 @@ static NTSTATUS pdb_init_samba_dsdb(struct pdb_methods **pdb_method,
                goto nomem;
        }
 
-       if (location) {
-               state->ldb = samdb_connect_url(state,
-                                  state->ev,
-                                  state->lp_ctx,
-                                  system_session(state->lp_ctx),
-                                  0, location);
-       } else {
-               state->ldb = samdb_connect(state,
-                                  state->ev,
-                                  state->lp_ctx,
-                                  system_session(state->lp_ctx), 0);
+       if (location == NULL) {
+               location = "sam.ldb";
        }
 
+       ret = samdb_connect_url(state,
+                               state->ev,
+                               state->lp_ctx,
+                               system_session(state->lp_ctx),
+                               0, location,
+                               &state->ldb, &errstring);
+
        if (!state->ldb) {
-               DEBUG(0, ("samdb_connect failed\n"));
+               DEBUG(0, ("samdb_connect failed: %s: %s\n",
+                         errstring, ldb_strerror(ret)));
                status = NT_STATUS_INTERNAL_ERROR;
                goto fail;
        }
index 9bf1b611fbb06bb520f07cf65eaab464b0e1c551..cf171cb66086de1b71bd8fa66d04c8c6f253bf1e 100644 (file)
@@ -614,6 +614,8 @@ _PUBLIC_ isc_result_t dlz_create(const char *dlzname,
        isc_result_t result;
        struct ldb_dn *dn;
        NTSTATUS nt_status;
+       int ret;
+       char *errstring = NULL;
 
        if (dlz_bind9_state != NULL) {
                *dbdata = dlz_bind9_state;
@@ -701,11 +703,14 @@ _PUBLIC_ isc_result_t dlz_create(const char *dlzname,
                }
        }
 
-       state->samdb = samdb_connect_url(state, state->ev_ctx, state->lp,
-                                       system_session(state->lp), 0, state->options.url);
-       if (state->samdb == NULL) {
-               state->log(ISC_LOG_ERROR, "samba_dlz: Failed to connect to %s",
-                       state->options.url);
+       ret = samdb_connect_url(state, state->ev_ctx, state->lp,
+                               system_session(state->lp), 0,
+                               state->options.url,
+                               &state->samdb, &errstring);
+       if (ret != LDB_SUCCESS) {
+               state->log(ISC_LOG_ERROR,
+                          "samba_dlz: Failed to connect to %s: %s",
+                          errstring, ldb_strerror(ret));
                result = ISC_R_FAILURE;
                goto failed;
        }
index 4584a61d475d1df394e9925aae74a451c1d07d20..1f80267e3e098aeeb35df11e5210f9c6ac7a76ad 100644 (file)
   connect to the SAM database specified by URL
   return an opaque context pointer on success, or NULL on failure
  */
-struct ldb_context *samdb_connect_url(TALLOC_CTX *mem_ctx,
-                                 struct tevent_context *ev_ctx,
-                                 struct loadparm_context *lp_ctx,
-                                 struct auth_session_info *session_info,
-                                 unsigned int flags, const char *url)
+int samdb_connect_url(TALLOC_CTX *mem_ctx,
+                     struct tevent_context *ev_ctx,
+                     struct loadparm_context *lp_ctx,
+                     struct auth_session_info *session_info,
+                     unsigned int flags, const char *url,
+                     struct ldb_context **ldb_ret,
+                     char **errstring)
 {
-       struct ldb_context *ldb;
+       struct ldb_context *ldb = NULL;
        int ret;
-
+       *ldb_ret = NULL;
+       *errstring = NULL;
        ldb = ldb_wrap_find(url, ev_ctx, lp_ctx, session_info, NULL, flags);
-       if (ldb != NULL)
-               return talloc_reference(mem_ctx, ldb);
+       if (ldb != NULL) {
+               *ldb_ret = talloc_reference(mem_ctx, ldb);
+               if (*ldb_ret == NULL) {
+                       return LDB_ERR_OPERATIONS_ERROR;
+               }
+               return LDB_SUCCESS;
+       }
 
        ldb = samba_ldb_init(mem_ctx, ev_ctx, lp_ctx, session_info, NULL);
 
-       if (ldb == NULL)
-               return NULL;
+       if (ldb == NULL) {
+               *errstring = talloc_asprintf(mem_ctx,
+                                            "Failed to set up Samba ldb "
+                                            "wrappers with samba_ldb_init() "
+                                            "to connect to %s",
+                                            url);
+               return LDB_ERR_OPERATIONS_ERROR;
+       }
 
        dsdb_set_global_schema(ldb);
 
        ret = samba_ldb_connect(ldb, lp_ctx, url, flags);
        if (ret != LDB_SUCCESS) {
+               *errstring = talloc_asprintf(mem_ctx,
+                                            "Failed to connect to %s: %s",
+                                            url,
+                                            ldb_errstring(ldb));
                talloc_free(ldb);
-               return NULL;
+               return LDB_ERR_OPERATIONS_ERROR;
        }
 
        if (!ldb_wrap_add(url, ev_ctx, lp_ctx, session_info, NULL, flags, ldb)) {
+               *errstring = talloc_asprintf(mem_ctx,
+                                            "Failed to add cached DB reference"
+                                            " to %s",
+                                            url);
                talloc_free(ldb);
-               return NULL;
+               return LDB_ERR_OPERATIONS_ERROR;
        }
 
-       return ldb;
+       *ldb_ret = ldb;
+       return LDB_SUCCESS;
 }
 
 
@@ -92,7 +115,14 @@ struct ldb_context *samdb_connect(TALLOC_CTX *mem_ctx,
                                  struct auth_session_info *session_info,
                                  unsigned int flags)
 {
-       return samdb_connect_url(mem_ctx, ev_ctx, lp_ctx, session_info, flags, "sam.ldb");
+       char *errstring;
+       struct ldb_context *ldb;
+       int ret = samdb_connect_url(mem_ctx, ev_ctx, lp_ctx, session_info, flags,
+                                   "sam.ldb", &ldb, &errstring);
+       if (ret == LDB_SUCCESS) {
+               return ldb;
+       }
+       return NULL;
 }
 
 /****************************************************************************
index 893158fa7305ae3355344d78021f00d49c95f753..2234e7a23f65870c2f0912e60df5963816968c82 100644 (file)
@@ -86,16 +86,18 @@ static isc_result_t dlz_bind9_writeable_zone_hook(dns_view_t *view,
                                           const char *zone_name)
 {
        struct torture_context *tctx = talloc_get_type((void *)view, struct torture_context);
-       struct ldb_context *samdb = samdb_connect_url(tctx, NULL, tctx->lp_ctx,
-                                                     system_session(tctx->lp_ctx),
-                                                     0,
-                                                     test_dlz_bind9_binddns_dir(tctx, "dns/sam.ldb"));
+       struct ldb_context *samdb = NULL;
+       char *errstring = NULL;
+       int ret = samdb_connect_url(tctx, NULL, tctx->lp_ctx,
+                                   system_session(tctx->lp_ctx),
+                                   0,
+                                   test_dlz_bind9_binddns_dir(tctx, "dns/sam.ldb"),
+                                   &samdb, &errstring);
        struct ldb_message *msg;
-       int ret;
        const char *attrs[] = {
                NULL
        };
-       if (!samdb) {
+       if (ret != LDB_SUCCESS) {
                torture_fail(tctx, "Failed to connect to samdb");
                return ISC_R_FAILURE;
        }