drs-cracknames: When cracking NT4 names we should just look at netbios for the match
[metze/samba/wip.git] / source4 / dsdb / samdb / cracknames.c
index bcf82c62388fb0c46839913b83c208e7e73ac80b..628546e959eb0deb063192d6546f98e19e886215 100644 (file)
@@ -394,10 +394,10 @@ static WERROR get_format_functional_filtering_param(struct ldb_context *sam_ctx,
 
                account = name;
                s = strchr(account, '/');
+               talloc_free(domain_res);
                while(s) {
                        s[0] = '\0';
                        s++;
-                       talloc_free(domain_res);
 
                        ldb_ret = ldb_search(sam_ctx, mem_ctx, &domain_res,
                                                tmp_dn,
@@ -410,18 +410,20 @@ static WERROR get_format_functional_filtering_param(struct ldb_context *sam_ctx,
                                info1->status = DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR;
                                return WERR_OK;
                        }
+                       talloc_free(tmp_dn);
                        switch (domain_res->count) {
                        case 1:
                                break;
                        case 0:
+                               talloc_free(domain_res);
                                info1->status = DRSUAPI_DS_NAME_STATUS_NOT_FOUND;
                                return WERR_OK;
                        default:
+                               talloc_free(domain_res);
                                info1->status = DRSUAPI_DS_NAME_STATUS_NOT_UNIQUE;
                                return WERR_OK;
                        }
 
-                       talloc_free(tmp_dn);
                        tmp_dn = talloc_steal(mem_ctx, domain_res->msgs[0]->dn);
                        talloc_free(domain_res);
                        search_dn = tmp_dn;
@@ -486,7 +488,10 @@ WERROR DsCrackNameOneName(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx,
                        if (!W_ERROR_IS_OK(werr)) {
                                return werr;
                        }
-                       if (info1->status != DRSUAPI_DS_NAME_STATUS_NOT_FOUND) {
+                       if (info1->status != DRSUAPI_DS_NAME_STATUS_NOT_FOUND &&
+                           (formats[i] != DRSUAPI_DS_NAME_FORMAT_CANONICAL ||
+                            info1->status != DRSUAPI_DS_NAME_STATUS_RESOLVE_ERROR))
+                       {
                                return werr;
                        }
                }
@@ -572,8 +577,7 @@ WERROR DsCrackNameOneName(struct ldb_context *sam_ctx, TALLOC_CTX *mem_ctx,
                }
 
                domain_filter = talloc_asprintf(mem_ctx, 
-                                               "(&(objectClass=crossRef)(|(dnsRoot=%s)(netbiosName=%s))(systemFlags:%s:=%u))",
-                                               ldb_binary_encode_string(mem_ctx, domain),
+                                               "(&(objectClass=crossRef)(netbiosName=%s)(systemFlags:%s:=%u))",
                                                ldb_binary_encode_string(mem_ctx, domain),
                                                LDB_OID_COMPARATOR_AND,
                                                SYSTEM_FLAG_CR_NTDS_DOMAIN);
@@ -943,7 +947,7 @@ static WERROR DsCrackNameOneFilter(struct ldb_context *sam_ctx, TALLOC_CTX *mem_
                        real_search_dn = NULL;
                }
                if (format_desired == DRSUAPI_DS_NAME_FORMAT_GUID){
-                        dsdb_flags = dsdb_flags| DSDB_SEARCH_SHOW_DELETED;
+                        dsdb_flags |= DSDB_SEARCH_SHOW_RECYCLED;
                }
 
                /* search with the 'phantom root' flag */