Fix bug 4901
[samba.git] / source / passdb / pdb_ldap.c
index 750b71fb1c8ac79a2d88c4b62eb587a51cc84267..d941abb00e68763279dda1dfb0a32e49c07f8581 100644 (file)
@@ -349,6 +349,7 @@ int ldapsam_search_suffix_by_name(struct ldapsam_privates *ldap_state,
        filter = talloc_asprintf(talloc_tos(), "(&%s%s)", "(uid=%u)",
                get_objclass_filter(ldap_state->schema_ver));
        if (!filter) {
+               SAFE_FREE(escape_user);
                return LDAP_NO_MEMORY;
        }
        /*
@@ -358,10 +359,10 @@ int ldapsam_search_suffix_by_name(struct ldapsam_privates *ldap_state,
 
        filter = talloc_all_string_sub(talloc_tos(),
                                filter, "%u", escape_user);
+       SAFE_FREE(escape_user);
        if (!filter) {
                return LDAP_NO_MEMORY;
        }
-       SAFE_FREE(escape_user);
 
        ret = smbldap_search_suffix(ldap_state->smbldap_state,
                        filter, attr, result);
@@ -407,7 +408,7 @@ static int ldapsam_search_suffix_by_sid (struct ldapsam_privates *ldap_state,
        filter = talloc_asprintf(talloc_tos(), "(&(%s=%s)%s)",
                get_userattr_key2string(ldap_state->schema_ver,
                        LDAP_ATTR_USER_SID),
-               sid_to_string(sid_string, sid),
+               sid_to_fstring(sid_string, sid),
                get_objclass_filter(ldap_state->schema_ver));
        if (!filter) {
                return LDAP_NO_MEMORY;
@@ -1135,8 +1136,9 @@ static bool init_ldap_from_sam (struct ldapsam_privates *ldap_state,
                        case SCHEMAVER_SAMBAACCOUNT:
                                if (!sid_peek_check_rid(&ldap_state->domain_sid, user_sid, &rid)) {
                                        DEBUG(1, ("init_ldap_from_sam: User's SID (%s) is not for this domain (%s), cannot add to LDAP!\n", 
-                                                 sid_string_static(user_sid),
-                                                 sid_string_static(&ldap_state->domain_sid)));
+                                                 sid_string_dbg(user_sid),
+                                                 sid_string_dbg(
+                                                         &ldap_state->domain_sid)));
                                        return False;
                                }
                                if (asprintf(&temp, "%i", rid) < 0) {
@@ -1151,7 +1153,7 @@ static bool init_ldap_from_sam (struct ldapsam_privates *ldap_state,
                        case SCHEMAVER_SAMBASAMACCOUNT:
                                smbldap_make_mod(ldap_state->smbldap_state->ldap_struct, existing, mods,
                                        get_userattr_key2string(ldap_state->schema_ver, LDAP_ATTR_USER_SID), 
-                                       sid_to_string(sid_string, user_sid));
+                                       sid_to_fstring(sid_string, user_sid));
                                break;
 
                        default:
@@ -1171,8 +1173,9 @@ static bool init_ldap_from_sam (struct ldapsam_privates *ldap_state,
                        case SCHEMAVER_SAMBAACCOUNT:
                                if (!sid_peek_check_rid(&ldap_state->domain_sid, group_sid, &rid)) {
                                        DEBUG(1, ("init_ldap_from_sam: User's Primary Group SID (%s) is not for this domain (%s), cannot add to LDAP!\n",
-                                                 sid_string_static(group_sid),
-                                                 sid_string_static(&ldap_state->domain_sid)));
+                                                 sid_string_dbg(group_sid),
+                                                 sid_string_dbg(
+                                                         &ldap_state->domain_sid)));
                                        return False;
                                }
 
@@ -1188,7 +1191,7 @@ static bool init_ldap_from_sam (struct ldapsam_privates *ldap_state,
                        case SCHEMAVER_SAMBASAMACCOUNT:
                                smbldap_make_mod(ldap_state->smbldap_state->ldap_struct, existing, mods,
                                        get_userattr_key2string(ldap_state->schema_ver, 
-                                       LDAP_ATTR_PRIMARY_GROUP_SID), sid_to_string(sid_string, group_sid));
+                                       LDAP_ATTR_PRIMARY_GROUP_SID), sid_to_fstring(sid_string, group_sid));
                                break;
 
                        default:
@@ -1451,79 +1454,6 @@ static bool init_ldap_from_sam (struct ldapsam_privates *ldap_state,
        return True;
 }
 
-/**********************************************************************
- Connect to LDAP server for password enumeration.
-*********************************************************************/
-
-static NTSTATUS ldapsam_setsampwent(struct pdb_methods *my_methods, bool update, uint32 acb_mask)
-{
-       struct ldapsam_privates *ldap_state = (struct ldapsam_privates *)my_methods->private_data;
-       int rc;
-       char *filter = NULL;
-       const char *suffix;
-       const char **attr_list;
-       bool machine_mask = False, user_mask = False;
-       NTSTATUS status = NT_STATUS_OK;
-       TALLOC_CTX *ctx = talloc_init("ldapsam_setsampwent");
-
-       if (!ctx) {
-               return NT_STATUS_NO_MEMORY;
-       }
-       filter = talloc_asprintf(ctx, "(&%s%s)", "(uid=%u)",
-               get_objclass_filter(ldap_state->schema_ver));
-       if (!filter) {
-               status = NT_STATUS_NO_MEMORY;
-               goto out;
-       }
-
-       filter = talloc_all_string_sub(ctx, filter, "%u", "*");
-       if (!filter) {
-               status = NT_STATUS_NO_MEMORY;
-               goto out;
-       }
-
-       machine_mask    = ((acb_mask != 0) && (acb_mask & (ACB_WSTRUST|ACB_SVRTRUST|ACB_DOMTRUST)));
-       user_mask       = ((acb_mask != 0) && (acb_mask & ACB_NORMAL));
-
-       if (machine_mask) {
-               suffix = lp_ldap_machine_suffix();
-       } else if (user_mask) {
-               suffix = lp_ldap_user_suffix();
-       } else {
-               suffix = lp_ldap_suffix();
-       }
-
-       DEBUG(10,("ldapsam_setsampwent: LDAP Query for acb_mask 0x%x will use suffix %s\n", 
-               acb_mask, suffix));
-
-       attr_list = get_userattr_list(NULL, ldap_state->schema_ver);
-       rc = smbldap_search(ldap_state->smbldap_state, suffix, LDAP_SCOPE_SUBTREE, filter, 
-                           attr_list, 0, &ldap_state->result);
-       TALLOC_FREE( attr_list );
-
-       if (rc != LDAP_SUCCESS) {
-               DEBUG(0, ("ldapsam_setsampwent: LDAP search failed: %s\n", ldap_err2string(rc)));
-               DEBUG(3, ("ldapsam_setsampwent: Query was: %s, %s\n", suffix, filter));
-               ldap_msgfree(ldap_state->result);
-               ldap_state->result = NULL;
-               status = NT_STATUS_UNSUCCESSFUL;
-               goto out;
-       }
-
-       DEBUG(2, ("ldapsam_setsampwent: %d entries in the base %s\n",
-               ldap_count_entries(ldap_state->smbldap_state->ldap_struct,
-               ldap_state->result), suffix));
-
-       ldap_state->entry = ldap_first_entry(ldap_state->smbldap_state->ldap_struct,
-                                ldap_state->result);
-       ldap_state->index = 0;
-
-  out:
-
-       TALLOC_FREE(ctx);
-       return status;
-}
-
 /**********************************************************************
  End enumeration of the LDAP password list.
 *********************************************************************/
@@ -1537,32 +1467,6 @@ static void ldapsam_endsampwent(struct pdb_methods *my_methods)
        }
 }
 
-/**********************************************************************
-Get the next entry in the LDAP password database.
-*********************************************************************/
-
-static NTSTATUS ldapsam_getsampwent(struct pdb_methods *my_methods,
-                                   struct samu *user)
-{
-       NTSTATUS ret = NT_STATUS_UNSUCCESSFUL;
-       struct ldapsam_privates *ldap_state =
-               (struct ldapsam_privates *)my_methods->private_data;
-       bool bret = False;
-
-       while (!bret) {
-               if (!ldap_state->entry)
-                       return ret;
-               
-               ldap_state->index++;
-               bret = init_sam_from_ldap(ldap_state, user, ldap_state->entry);
-               
-               ldap_state->entry = ldap_next_entry(priv2ld(ldap_state),
-                                                   ldap_state->entry); 
-       }
-
-       return NT_STATUS_OK;
-}
-
 static void append_attr(TALLOC_CTX *mem_ctx, const char ***attr_list,
                        const char *new_attr)
 {
@@ -1696,7 +1600,6 @@ static NTSTATUS ldapsam_getsampwsid(struct pdb_methods *my_methods, struct samu
        LDAPMessage *entry = NULL;
        int count;
        int rc;
-       fstring sid_string;
 
        rc = ldapsam_get_ldap_user_by_sid(ldap_state, 
                                          sid, &result); 
@@ -1706,13 +1609,14 @@ static NTSTATUS ldapsam_getsampwsid(struct pdb_methods *my_methods, struct samu
        count = ldap_count_entries(ldap_state->smbldap_state->ldap_struct, result);
        
        if (count < 1) {
-               DEBUG(4, ("ldapsam_getsampwsid: Unable to locate SID [%s] count=%d\n", sid_to_string(sid_string, sid),
-                      count));
+               DEBUG(4, ("ldapsam_getsampwsid: Unable to locate SID [%s] "
+                         "count=%d\n", sid_string_dbg(sid), count));
                ldap_msgfree(result);
                return NT_STATUS_NO_SUCH_USER;
        }  else if (count > 1) {
-               DEBUG(1, ("ldapsam_getsampwsid: More than one user with SID [%s]. Failing. count=%d\n", sid_to_string(sid_string, sid),
-                      count));
+               DEBUG(1, ("ldapsam_getsampwsid: More than one user with SID "
+                         "[%s]. Failing. count=%d\n", sid_string_dbg(sid),
+                         count));
                ldap_msgfree(result);
                return NT_STATUS_NO_SUCH_USER;
        }
@@ -1865,6 +1769,10 @@ static NTSTATUS ldapsam_modify_entry(struct pdb_methods *my_methods,
                                pdb_get_username(newpwd), ldap_err2string(rc), ld_error?ld_error:"unknown"));
                        SAFE_FREE(ld_error);
                        ber_bvfree(bv);
+#if defined(LDAP_CONSTRAINT_VIOLATION)
+                       if (rc == LDAP_CONSTRAINT_VIOLATION)
+                               return NT_STATUS_PASSWORD_RESTRICTION;
+#endif
                        return NT_STATUS_UNSUCCESSFUL;
                } else {
                        DEBUG(3,("ldapsam_modify_entry: LDAP Password changed for user %s\n",pdb_get_username(newpwd)));
@@ -2005,8 +1913,9 @@ static NTSTATUS ldapsam_update_sam_account(struct pdb_methods *my_methods, struc
                        ldap_mods_free(mods,True);
                return NT_STATUS_UNSUCCESSFUL;
        }
-       
-       if (mods == NULL) {
+
+       if ((lp_ldap_passwd_sync() != LDAP_PASSWD_SYNC_ONLY)
+           && (mods == NULL)) {
                DEBUG(4,("ldapsam_update_sam_account: mods is empty: nothing to update for user: %s\n",
                         pdb_get_username(newpwd)));
                SAFE_FREE(dn);
@@ -2014,7 +1923,11 @@ static NTSTATUS ldapsam_update_sam_account(struct pdb_methods *my_methods, struc
        }
        
        ret = ldapsam_modify_entry(my_methods,newpwd,dn,mods,LDAP_MOD_REPLACE, element_is_changed);
-       ldap_mods_free(mods,True);
+
+       if (mods != NULL) {
+               ldap_mods_free(mods,True);
+       }
+
        SAFE_FREE(dn);
 
        /*
@@ -2066,7 +1979,7 @@ static NTSTATUS ldapsam_rename_sam_account(struct pdb_methods *my_methods,
 
        /* rename the posix user */
        rename_script = SMB_STRDUP(lp_renameuser_script());
-       if (rename_script) {
+       if (rename_script == NULL) {
                return NT_STATUS_NO_MEMORY;
        }
 
@@ -2148,7 +2061,6 @@ static NTSTATUS ldapsam_add_sam_account(struct pdb_methods *my_methods, struct s
        const DOM_SID   *sid = pdb_get_user_sid(newpwd);
        char *filter = NULL;
        char *dn = NULL;
-       fstring         sid_string;
        NTSTATUS status = NT_STATUS_UNSUCCESSFUL;
        TALLOC_CTX *ctx = talloc_init("ldapsam_add_sam_account");
 
@@ -2184,8 +2096,9 @@ static NTSTATUS ldapsam_add_sam_account(struct pdb_methods *my_methods, struct s
                                                  sid, &result);
                if (rc == LDAP_SUCCESS) {
                        if (ldap_count_entries(ldap_state->smbldap_state->ldap_struct, result) != 0) {
-                               DEBUG(0,("ldapsam_add_sam_account: SID '%s' already in the base, with samba attributes\n", 
-                                        sid_to_string(sid_string, sid)));
+                               DEBUG(0,("ldapsam_add_sam_account: SID '%s' "
+                                        "already in the base, with samba "
+                                        "attributes\n", sid_string_dbg(sid)));
                                goto fn_exit;
                        }
                        ldap_msgfree(result);
@@ -2575,11 +2488,12 @@ static NTSTATUS ldapsam_getgrsid(struct pdb_methods *methods, GROUP_MAP *map,
 {
        char *filter = NULL;
        NTSTATUS status;
+       fstring tmp;
 
        if (asprintf(&filter, "(&(objectClass=%s)(%s=%s))",
                LDAP_OBJ_GROUPMAP,
                get_attr_key2string(groupmap_attr_list, LDAP_ATTR_GROUP_SID),
-               sid_string_static(&sid)) < 0) {
+               sid_to_fstring(tmp, &sid)) < 0) {
                return NT_STATUS_NO_MEMORY;
        }
 
@@ -2659,7 +2573,7 @@ static bool ldapsam_extract_rid_from_entry(LDAP *ldap_struct,
 
        if (sid_compare_domain(&sid, domain_sid) != 0) {
                DEBUG(10, ("SID %s is not in expected domain %s\n",
-                          str, sid_string_static(domain_sid)));
+                          str, sid_string_dbg(domain_sid)));
                return False;
        }
 
@@ -2719,7 +2633,7 @@ static NTSTATUS ldapsam_enum_group_members(struct pdb_methods *methods,
 
        if (count > 1) {
                DEBUG(1, ("Found more than one groupmap entry for %s\n",
-                         sid_string_static(group)));
+                         sid_string_dbg(group)));
                ret = NT_STATUS_INTERNAL_DB_CORRUPTION;
                goto done;
        }
@@ -2775,7 +2689,7 @@ static NTSTATUS ldapsam_enum_group_members(struct pdb_methods *methods,
                        goto done;
                }
 
-               rc = smbldap_search(conn, lp_ldap_user_suffix(),
+               rc = smbldap_search(conn, lp_ldap_suffix(),
                                    LDAP_SCOPE_SUBTREE, filter, sid_attrs, 0,
                                    &result);
 
@@ -2831,7 +2745,7 @@ static NTSTATUS ldapsam_enum_group_members(struct pdb_methods *methods,
                                 LDAP_OBJ_SAMBASAMACCOUNT,
                                 gidstr);
 
-       rc = smbldap_search(conn, lp_ldap_user_suffix(),
+       rc = smbldap_search(conn, lp_ldap_suffix(),
                            LDAP_SCOPE_SUBTREE, filter, sid_attrs, 0,
                            &result);
 
@@ -2915,7 +2829,7 @@ static NTSTATUS ldapsam_enum_group_memberships(struct pdb_methods *methods,
                goto done;
        }
 
-       rc = smbldap_search(conn, lp_ldap_user_suffix(),
+       rc = smbldap_search(conn, lp_ldap_suffix(),
                            LDAP_SCOPE_SUBTREE, filter, attrs, 0, &result);
 
        if (rc != LDAP_SUCCESS)
@@ -2978,8 +2892,9 @@ static NTSTATUS ldapsam_enum_group_memberships(struct pdb_methods *methods,
 
        /* This sid will be replaced later */
 
-       if (!add_sid_to_array_unique(mem_ctx, &global_sid_NULL, pp_sids, &num_sids)) {
-               ret = NT_STATUS_NO_MEMORY;
+       ret = add_sid_to_array_unique(mem_ctx, &global_sid_NULL, pp_sids,
+                                     &num_sids);
+       if (!NT_STATUS_IS_OK(ret)) {
                goto done;
        }
 
@@ -3018,9 +2933,9 @@ static NTSTATUS ldapsam_enum_group_memberships(struct pdb_methods *methods,
                                ret = NT_STATUS_NO_MEMORY;
                                goto done;
                        }
-                       if (!add_sid_to_array_unique(mem_ctx, &sid, pp_sids,
-                                               &num_sids)) {
-                               ret = NT_STATUS_NO_MEMORY;
+                       ret = add_sid_to_array_unique(mem_ctx, &sid, pp_sids,
+                                                     &num_sids);
+                       if (!NT_STATUS_IS_OK(ret)) {
                                goto done;
                        }
                }
@@ -3082,7 +2997,7 @@ static NTSTATUS ldapsam_map_posixgroup(TALLOC_CTX *mem_ctx,
        smbldap_set_mod(&mods, LDAP_MOD_ADD, "objectClass",
                        "sambaGroupMapping");
        smbldap_make_mod(ldap_state->smbldap_state->ldap_struct, entry, &mods, "sambaSid",
-                        sid_string_static(&map->sid));
+                        sid_string_talloc(mem_ctx, &map->sid));
        smbldap_make_mod(ldap_state->smbldap_state->ldap_struct, entry, &mods, "sambaGroupType",
                         talloc_asprintf(mem_ctx, "%d", map->sid_name_use));
        smbldap_make_mod(ldap_state->smbldap_state->ldap_struct, entry, &mods, "displayName",
@@ -3138,8 +3053,7 @@ static NTSTATUS ldapsam_add_group_mapping_entry(struct pdb_methods *methods,
            (ldap_count_entries(ldap_state->smbldap_state->ldap_struct, msg) > 0)) {
 
                DEBUG(3, ("SID %s already present in LDAP, refusing to add "
-                         "group mapping entry\n",
-                         sid_string_static(&map->sid)));
+                         "group mapping entry\n", sid_string_dbg(&map->sid)));
                result = NT_STATUS_GROUP_EXISTS;
                goto done;
        }
@@ -3158,7 +3072,7 @@ static NTSTATUS ldapsam_add_group_mapping_entry(struct pdb_methods *methods,
                        && !sid_check_is_in_builtin(&map->sid) ) 
                {
                        DEBUG(3, ("Refusing to map sid %s as an alias, not in our domain\n",
-                                 sid_string_static(&map->sid)));
+                                 sid_string_dbg(&map->sid)));
                        result = NT_STATUS_INVALID_PARAMETER;
                        goto done;
                }
@@ -3182,7 +3096,7 @@ static NTSTATUS ldapsam_add_group_mapping_entry(struct pdb_methods *methods,
 
        if (pdb_gid_to_sid(map->gid, &sid)) {
                DEBUG(3, ("Gid %d is already mapped to SID %s, refusing to "
-                         "add\n", map->gid, sid_string_static(&sid)));
+                         "add\n", map->gid, sid_string_dbg(&sid)));
                result = NT_STATUS_GROUP_EXISTS;
                goto done;
        }
@@ -3544,6 +3458,7 @@ static NTSTATUS ldapsam_modify_aliasmem(struct pdb_methods *methods,
        LDAPMod **mods = NULL;
        int rc;
        enum lsa_SidType type = SID_NAME_USE_NONE;
+       fstring tmp;
 
        char *filter = NULL;
 
@@ -3557,13 +3472,13 @@ static NTSTATUS ldapsam_modify_aliasmem(struct pdb_methods *methods,
 
        if (type == SID_NAME_USE_NONE) {
                DEBUG(5, ("SID %s is neither in builtin nor in our domain!\n",
-                         sid_string_static(alias)));
+                         sid_string_dbg(alias)));
                return NT_STATUS_NO_SUCH_ALIAS;
        }
 
        if (asprintf(&filter,
                     "(&(objectClass=%s)(sambaSid=%s)(sambaGroupType=%d))",
-                    LDAP_OBJ_GROUPMAP, sid_string_static(alias),
+                    LDAP_OBJ_GROUPMAP, sid_to_fstring(tmp, alias),
                     type) < 0) {
                return NT_STATUS_NO_MEMORY;
        }
@@ -3611,7 +3526,7 @@ static NTSTATUS ldapsam_modify_aliasmem(struct pdb_methods *methods,
        smbldap_set_mod(&mods, modop,
                        get_attr_key2string(groupmap_attr_list,
                                            LDAP_ATTR_SID_LIST),
-                       sid_string_static(member));
+                       sid_to_fstring(tmp, member));
 
        rc = smbldap_modify(ldap_state->smbldap_state, dn, mods);
 
@@ -3664,6 +3579,7 @@ static NTSTATUS ldapsam_enum_aliasmem(struct pdb_methods *methods,
        char *filter = NULL;
        size_t num_members = 0;
        enum lsa_SidType type = SID_NAME_USE_NONE;
+       fstring tmp;
 
        *pp_members = NULL;
        *p_num_members = 0;
@@ -3678,13 +3594,13 @@ static NTSTATUS ldapsam_enum_aliasmem(struct pdb_methods *methods,
 
        if (type == SID_NAME_USE_NONE) {
                DEBUG(5, ("SID %s is neither in builtin nor in our domain!\n",
-                         sid_string_static(alias)));
+                         sid_string_dbg(alias)));
                return NT_STATUS_NO_SUCH_ALIAS;
        }
 
        if (asprintf(&filter,
                     "(&(objectClass=%s)(sambaSid=%s)(sambaGroupType=%d))",
-                    LDAP_OBJ_GROUPMAP, sid_string_static(alias),
+                    LDAP_OBJ_GROUPMAP, sid_to_fstring(tmp, alias),
                     type) < 0) {
                return NT_STATUS_NO_MEMORY;
        }
@@ -3737,14 +3653,17 @@ static NTSTATUS ldapsam_enum_aliasmem(struct pdb_methods *methods,
 
        for (i=0; i<count; i++) {
                DOM_SID member;
+               NTSTATUS status;
 
                if (!string_to_sid(&member, values[i]))
                        continue;
 
-               if (!add_sid_to_array(NULL, &member, pp_members, &num_members)) {
+               status = add_sid_to_array(NULL, &member, pp_members,
+                                         &num_members);
+               if (!NT_STATUS_IS_OK(status)) {
                        ldap_value_free(values);
                        ldap_msgfree(result);
-                       return NT_STATUS_NO_MEMORY;
+                       return status;
                }
        }
 
@@ -3786,7 +3705,7 @@ static NTSTATUS ldapsam_alias_memberships(struct pdb_methods *methods,
 
        if (type == SID_NAME_USE_NONE) {
                DEBUG(5, ("SID %s is neither builtin nor domain!\n",
-                         sid_string_static(domain_sid)));
+                         sid_string_dbg(domain_sid)));
                return NT_STATUS_UNSUCCESSFUL;
        }
 
@@ -4071,8 +3990,9 @@ static NTSTATUS ldapsam_lookup_rids(struct pdb_methods *methods,
        for (i=0; i<num_rids; i++) {
                DOM_SID sid;
                sid_compose(&sid, domain_sid, rids[i]);
-               allsids = talloc_asprintf_append_buffer(allsids, "(sambaSid=%s)",
-                                                sid_string_static(&sid));
+               allsids = talloc_asprintf_append_buffer(
+                       allsids, "(sambaSid=%s)",
+                       sid_string_talloc(mem_ctx, &sid));
                if (allsids == NULL) {
                        goto done;
                }
@@ -4548,7 +4468,7 @@ static bool ldapuser2displayentry(struct ldap_search_state *state,
 
        if (!sid_peek_check_rid(get_global_sam_sid(), &sid, &result->rid)) {
                DEBUG(0, ("sid %s does not belong to our domain\n",
-                         sid_string_static(&sid)));
+                         sid_string_dbg(&sid)));
                return False;
        }
 
@@ -4701,7 +4621,7 @@ static bool ldapgroup2displayentry(struct ldap_search_state *state,
                                && !sid_peek_check_rid(&global_sid_Builtin, &sid, &result->rid)) 
                        {
                                DEBUG(0, ("%s is not in our domain\n",
-                                         sid_string_static(&sid)));
+                                         sid_string_dbg(&sid)));
                                return False;
                        }
                        break;
@@ -4722,6 +4642,7 @@ static bool ldapsam_search_grouptype(struct pdb_methods *methods,
        struct ldapsam_privates *ldap_state =
                (struct ldapsam_privates *)methods->private_data;
        struct ldap_search_state *state;
+       fstring tmp;
 
        state = TALLOC_P(search->mem_ctx, struct ldap_search_state);
        if (state == NULL) {
@@ -4737,7 +4658,7 @@ static bool ldapsam_search_grouptype(struct pdb_methods *methods,
        state->filter = talloc_asprintf(search->mem_ctx,
                                        "(&(objectclass=sambaGroupMapping)"
                                        "(sambaGroupType=%d)(sambaSID=%s*))", 
-                                       type, sid_string_static(sid));
+                                       type, sid_to_fstring(tmp, sid));
        state->attrs = talloc_attrs(search->mem_ctx, "cn", "sambaSid",
                                    "displayName", "description",
                                    "sambaGroupType", NULL);
@@ -6166,9 +6087,6 @@ static NTSTATUS pdb_init_ldapsam_common(struct pdb_methods **pdb_method, const c
 
        (*pdb_method)->name = "ldapsam";
 
-       (*pdb_method)->setsampwent = ldapsam_setsampwent;
-       (*pdb_method)->endsampwent = ldapsam_endsampwent;
-       (*pdb_method)->getsampwent = ldapsam_getsampwent;
        (*pdb_method)->getsampwnam = ldapsam_getsampwnam;
        (*pdb_method)->getsampwsid = ldapsam_getsampwsid;
        (*pdb_method)->add_sam_account = ldapsam_add_sam_account;
@@ -6352,7 +6270,7 @@ NTSTATUS pdb_init_ldapsam(struct pdb_methods **pdb_method, const char *location)
                    entry,
                    get_userattr_key2string(ldap_state->schema_ver,
                                            LDAP_ATTR_USER_SID),
-                   NULL);
+                   talloc_tos());
 
        if (domain_sid_string) {
                bool found_sid;
@@ -6367,21 +6285,17 @@ NTSTATUS pdb_init_ldapsam(struct pdb_methods **pdb_method, const char *location)
                                                     &secrets_domain_sid);
                if (!found_sid || !sid_equal(&secrets_domain_sid,
                                             &ldap_domain_sid)) {
-                       fstring new_sid_str, old_sid_str;
                        DEBUG(1, ("pdb_init_ldapsam: Resetting SID for domain "
                                  "%s based on pdb_ldap results %s -> %s\n",
                                  ldap_state->domain_name,
-                                 sid_to_string(old_sid_str,
-                                               &secrets_domain_sid),
-                                 sid_to_string(new_sid_str,
-                                               &ldap_domain_sid)));
+                                 sid_string_dbg(&secrets_domain_sid),
+                                 sid_string_dbg(&ldap_domain_sid)));
 
                        /* reset secrets.tdb sid */
                        secrets_store_domain_sid(ldap_state->domain_name,
                                                 &ldap_domain_sid);
                        DEBUG(1, ("New global sam SID: %s\n",
-                                 sid_to_string(new_sid_str,
-                                               get_global_sam_sid())));
+                                 sid_string_dbg(get_global_sam_sid())));
                }
                sid_copy(&ldap_state->domain_sid, &ldap_domain_sid);
                TALLOC_FREE(domain_sid_string);
@@ -6392,7 +6306,7 @@ NTSTATUS pdb_init_ldapsam(struct pdb_methods **pdb_method, const char *location)
                    entry,
                    get_attr_key2string( dominfo_attr_list,
                                         LDAP_ATTR_ALGORITHMIC_RID_BASE ),
-                   NULL);
+                   talloc_tos());
        if (alg_rid_base_string) {
                alg_rid_base = (uint32)atol(alg_rid_base_string);
                if (alg_rid_base != algorithmic_rid_base()) {