res_config_ldap: Fix erroneous LDAP_MOD_REPLACE in LDAP modify
authorSean Bright <sean.bright@gmail.com>
Mon, 20 Feb 2017 11:27:38 +0000 (06:27 -0500)
committerSean Bright <sean.bright@gmail.com>
Mon, 20 Feb 2017 12:05:31 +0000 (07:05 -0500)
We always treat the first change of our modification batch as a
replacement when it sometimes is actually a delete. So we have to pass
the correct arguments to the OpenLDAP library.

ASTERISK-26580 #close
Reported by: Nicholas John Koch
Patches:
res_config_ldap.c-11.24.1.patch (license #6833) patch uploaded
by Nicholas John Koch

Change-Id: I0741d25de07c9539f1edc6eff3696165dfb64fbe

res/res_config_ldap.c

index 5e95853..a8a8fe6 100644 (file)
@@ -1292,12 +1292,15 @@ static int update_ldap(const char *basedn, const char *table_name, const char *a
        mods_size = 2; /* one for the first param/value pair and one for the the terminating NULL */
        ldap_mods = ldap_memcalloc(sizeof(LDAPMod *), mods_size);
        ldap_mods[0] = ldap_memcalloc(1, sizeof(LDAPMod));
-
-       ldap_mods[0]->mod_op = LDAP_MOD_REPLACE;
        ldap_mods[0]->mod_type = ldap_strdup(newparam);
 
-       ldap_mods[0]->mod_values = ast_calloc(sizeof(char *), 2);
-       ldap_mods[0]->mod_values[0] = ldap_strdup(field->value);
+       if (strlen(field->value) == 0) {
+               ldap_mods[0]->mod_op = LDAP_MOD_DELETE;
+       } else {
+               ldap_mods[0]->mod_op = LDAP_MOD_REPLACE;
+               ldap_mods[0]->mod_values = ast_calloc(sizeof(char *), 2);
+               ldap_mods[0]->mod_values[0] = ldap_strdup(field->value);
+       }
 
        while ((field = field->next)) {
                newparam = convert_attribute_name_to_ldap(table_config, field->name);