diff options
Diffstat (limited to 'source3')
-rw-r--r-- | source3/include/tldap_util.h | 8 | ||||
-rw-r--r-- | source3/lib/tldap_util.c | 20 | ||||
-rw-r--r-- | source3/passdb/pdb_ads.c | 18 |
3 files changed, 27 insertions, 19 deletions
diff --git a/source3/include/tldap_util.h b/source3/include/tldap_util.h index d0268fe1d6..6a99a5f78a 100644 --- a/source3/include/tldap_util.h +++ b/source3/include/tldap_util.h @@ -33,10 +33,12 @@ bool tldap_pull_binsid(struct tldap_message *msg, const char *attribute, struct dom_sid *sid); bool tldap_pull_guid(struct tldap_message *msg, const char *attribute, struct GUID *guid); -bool tldap_add_mod_blobs(TALLOC_CTX *mem_ctx, struct tldap_mod **pmods, +bool tldap_add_mod_blobs(TALLOC_CTX *mem_ctx, + struct tldap_mod **pmods, int *pnum_mods, int mod_op, const char *attrib, - DATA_BLOB *values, int num_values); -bool tldap_add_mod_str(TALLOC_CTX *mem_ctx, struct tldap_mod **pmods, + DATA_BLOB *newvals, int num_newvals); +bool tldap_add_mod_str(TALLOC_CTX *mem_ctx, + struct tldap_mod **pmods, int *pnum_mods, int mod_op, const char *attrib, const char *str); bool tldap_make_mod_blob(struct tldap_message *existing, TALLOC_CTX *mem_ctx, struct tldap_mod **pmods, int *pnum_mods, diff --git a/source3/lib/tldap_util.c b/source3/lib/tldap_util.c index 2646348aa1..e42188a2ab 100644 --- a/source3/lib/tldap_util.c +++ b/source3/lib/tldap_util.c @@ -132,7 +132,7 @@ static bool tldap_add_blob_vals(TALLOC_CTX *mem_ctx, struct tldap_mod *mod, } bool tldap_add_mod_blobs(TALLOC_CTX *mem_ctx, - struct tldap_mod **pmods, + struct tldap_mod **pmods, int *pnum_mods, int mod_op, const char *attrib, DATA_BLOB *newvals, int num_newvals) { @@ -148,7 +148,7 @@ bool tldap_add_mod_blobs(TALLOC_CTX *mem_ctx, return false; } - num_mods = talloc_array_length(mods); + num_mods = *pnum_mods; for (i=0; i<num_mods; i++) { if ((mods[i].mod_op == mod_op) @@ -174,7 +174,7 @@ bool tldap_add_mod_blobs(TALLOC_CTX *mem_ctx, return false; } - if (i == num_mods) { + if ((i == num_mods) && (talloc_array_length(mods) < num_mods + 1)) { mods = talloc_realloc(talloc_tos(), mods, struct tldap_mod, num_mods+1); if (mods == NULL) { @@ -184,10 +184,12 @@ bool tldap_add_mod_blobs(TALLOC_CTX *mem_ctx, } *pmods = mods; + *pnum_mods += 1; return true; } -bool tldap_add_mod_str(TALLOC_CTX *mem_ctx, struct tldap_mod **pmods, +bool tldap_add_mod_str(TALLOC_CTX *mem_ctx, + struct tldap_mod **pmods, int *pnum_mods, int mod_op, const char *attrib, const char *str) { DATA_BLOB utf8; @@ -199,7 +201,8 @@ bool tldap_add_mod_str(TALLOC_CTX *mem_ctx, struct tldap_mod **pmods, return false; } - ret = tldap_add_mod_blobs(mem_ctx, pmods, mod_op, attrib, &utf8, 1); + ret = tldap_add_mod_blobs(mem_ctx, pmods, pnum_mods, mod_op, attrib, + &utf8, 1); TALLOC_FREE(utf8.data); return ret; } @@ -248,7 +251,8 @@ static bool tldap_make_mod_blob_int(struct tldap_message *existing, DEBUG(10, ("smbldap_make_mod_blob: deleting attribute |%s|\n", attrib)); - if (!tldap_add_mod_blobs(mem_ctx, pmods, TLDAP_MOD_DELETE, + if (!tldap_add_mod_blobs(mem_ctx, pmods, pnum_mods, + TLDAP_MOD_DELETE, attrib, &oldval, 1)) { return false; } @@ -261,12 +265,12 @@ static bool tldap_make_mod_blob_int(struct tldap_message *existing, if (newval.data != NULL) { DEBUG(10, ("smbldap_make_mod: adding attribute |%s| value len " "%d\n", attrib, (int)newval.length)); - if (!tldap_add_mod_blobs(mem_ctx, pmods, TLDAP_MOD_ADD, + if (!tldap_add_mod_blobs(mem_ctx, pmods, pnum_mods, + TLDAP_MOD_ADD, attrib, &newval, 1)) { return false; } } - *pnum_mods = talloc_array_length(*pmods); return true; } diff --git a/source3/passdb/pdb_ads.c b/source3/passdb/pdb_ads.c index 99170aacc3..8c5ea81145 100644 --- a/source3/passdb/pdb_ads.c +++ b/source3/passdb/pdb_ads.c @@ -330,11 +330,9 @@ static bool pdb_ads_init_ads_from_sam(struct pdb_ads_state *state, } blob = data_blob_const(pw_utf16, pw_utf16_len); - ret &= tldap_add_mod_blobs(mem_ctx, pmods, TLDAP_MOD_REPLACE, + ret &= tldap_add_mod_blobs(mem_ctx, pmods, pnum_mods, + TLDAP_MOD_REPLACE, "unicodePwd", &blob, 1); - if (ret) { - *pnum_mods = talloc_array_length(*pmods); - } TALLOC_FREE(pw_utf16); TALLOC_FREE(pw_quote); } @@ -1084,6 +1082,7 @@ static NTSTATUS pdb_ads_mod_groupmem(struct pdb_methods *m, struct dom_sid groupsid, membersid; char *groupdn, *memberdn; struct tldap_mod *mods; + int num_mods; int rc; NTSTATUS status; @@ -1107,14 +1106,15 @@ static NTSTATUS pdb_ads_mod_groupmem(struct pdb_methods *m, } mods = NULL; + num_mods = 0; - if (!tldap_add_mod_str(talloc_tos(), &mods, mod_op, + if (!tldap_add_mod_str(talloc_tos(), &mods, &num_mods, mod_op, "member", memberdn)) { TALLOC_FREE(frame); return NT_STATUS_NO_MEMORY; } - rc = tldap_modify(ld, groupdn, mods, 1, NULL, 0, NULL, 0); + rc = tldap_modify(ld, groupdn, mods, num_mods, NULL, 0, NULL, 0); TALLOC_FREE(frame); if (rc != TLDAP_SUCCESS) { DEBUG(10, ("ldap_modify failed: %s\n", @@ -1414,6 +1414,7 @@ static NTSTATUS pdb_ads_mod_aliasmem(struct pdb_methods *m, struct tldap_context *ld; TALLOC_CTX *frame = talloc_stackframe(); struct tldap_mod *mods; + int num_mods; int rc; char *aliasdn, *memberdn; NTSTATUS status; @@ -1439,14 +1440,15 @@ static NTSTATUS pdb_ads_mod_aliasmem(struct pdb_methods *m, } mods = NULL; + num_mods = 0; - if (!tldap_add_mod_str(talloc_tos(), &mods, mod_op, + if (!tldap_add_mod_str(talloc_tos(), &mods, &num_mods, mod_op, "member", memberdn)) { TALLOC_FREE(frame); return NT_STATUS_NO_MEMORY; } - rc = tldap_modify(ld, aliasdn, mods, 1, NULL, 0, NULL, 0); + rc = tldap_modify(ld, aliasdn, mods, num_mods, NULL, 0, NULL, 0); TALLOC_FREE(frame); if (rc != TLDAP_SUCCESS) { DEBUG(10, ("ldap_modify failed: %s\n", |