summaryrefslogtreecommitdiffstats
path: root/ldap/servers/slapd/modutil.c
diff options
context:
space:
mode:
Diffstat (limited to 'ldap/servers/slapd/modutil.c')
-rw-r--r--ldap/servers/slapd/modutil.c30
1 files changed, 28 insertions, 2 deletions
diff --git a/ldap/servers/slapd/modutil.c b/ldap/servers/slapd/modutil.c
index 9c5949d5..82147c69 100644
--- a/ldap/servers/slapd/modutil.c
+++ b/ldap/servers/slapd/modutil.c
@@ -188,11 +188,37 @@ void
slapi_mods_insert_at(Slapi_Mods *smods, LDAPMod *mod, int pos)
{
int i;
- slapi_mods_add_one_element(smods);
- for( i=smods->num_mods-1; i>=pos; i--)
+ Slapi_Attr a = {0};
+
+ if (NULL == mod) {
+ return;
+ }
+ slapi_mods_add_one_element(smods);
+ for( i=smods->num_mods-1; i>=pos; i--)
{
smods->mods[i+1]= smods->mods[i];
}
+ slapi_attr_init(&a, mod->mod_type);
+ /* Check if the type of the to-be-added values has DN syntax or not. */
+ if (slapi_attr_is_dn_syntax_attr(&a)) {
+ int rc = 0;
+ struct berval **mbvp = NULL;
+ char *normed = NULL;
+ size_t len = 0;
+ for (mbvp = mod->mod_bvalues; mbvp && *mbvp; mbvp++) {
+ rc = slapi_dn_normalize_ext((*mbvp)->bv_val, (*mbvp)->bv_len,
+ &normed, &len);
+ if (rc > 0) {
+ slapi_ch_free((void **)&((*mbvp)->bv_val));
+ } else if (rc == 0) {
+ /* original is passed in; not null terminated */
+ *(normed + len) = '\0';
+ }
+ (*mbvp)->bv_val = normed;
+ (*mbvp)->bv_len = len;
+ }
+ }
+ attr_done(&a);
smods->mods[pos]= mod;
smods->num_mods++;
smods->mods[smods->num_mods]= NULL;