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,
}
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)
{
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)
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) {
}
*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;
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;
}
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;
}
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;
}
}
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);
}
struct dom_sid groupsid, membersid;
char *groupdn, *memberdn;
struct tldap_mod *mods;
+ int num_mods;
int rc;
NTSTATUS status;
}
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",
struct tldap_context *ld;
TALLOC_CTX *frame = talloc_stackframe();
struct tldap_mod *mods;
+ int num_mods;
int rc;
char *aliasdn, *memberdn;
NTSTATUS status;
}
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",