diff -up cpu-1.4.3/src/include/plugins/ldap/ldap.h.mod-delete cpu-1.4.3/src/include/plugins/ldap/ldap.h --- cpu-1.4.3/src/include/plugins/ldap/ldap.h.mod-delete 2003-12-30 20:22:20.000000000 -0700 +++ cpu-1.4.3/src/include/plugins/ldap/ldap.h 2010-11-05 23:54:19.000000000 -0600 @@ -127,8 +127,8 @@ int ldapCat(LDAP *ld); uid_t getNextUid(LDAP * ld); gid_t getNextGid(LDAP * ld, ldapop_t op); int ldapUserCheck(int mod_op, LDAP * ld); -int ldapGroupCheck(int mod_op); -LDAPMod ** ldapBuildListStr(int mod_op, char * mod_type, char * value, +int ldapGroupCheck(int mod_op, LDAP * ld); +LDAPMod ** ldapBuildListStr(LDAP * ld, int mod_op, char * mod_type, char * value, LDAPMod ** mods); LDAPMod ** ldapBuildList(int mod_op, char * mod_type, char ** value, LDAPMod ** mods); diff -up cpu-1.4.3/src/plugins/ldap/group.c.mod-delete cpu-1.4.3/src/plugins/ldap/group.c --- cpu-1.4.3/src/plugins/ldap/group.c.mod-delete 2003-10-12 17:34:59.000000000 -0600 +++ cpu-1.4.3/src/plugins/ldap/group.c 2010-11-05 23:54:19.000000000 -0600 @@ -31,7 +31,7 @@ LDAPMod **groupMod = NULL; int ldapGroupAdd (LDAP * ld) { - if (ldapGroupCheck (LDAP_MOD_ADD) < 0) + if (ldapGroupCheck (LDAP_MOD_ADD, ld) < 0) { fprintf (stderr, "ldap: ldapGroupAdd: error in ldapGroupCheck\n"); return -1; @@ -50,7 +50,7 @@ int ldapGroupMod (LDAP * ld) { char *newdn = NULL; - if (ldapGroupCheck (LDAP_MOD_REPLACE) < 0) + if (ldapGroupCheck (LDAP_MOD_REPLACE, ld) < 0) { fprintf (stderr, "ldap: ldapGroupMod: error in ldapGroupCheck\n"); return -1; @@ -105,7 +105,7 @@ ldapGroupDel (LDAP * ld) } int -ldapGroupCheck (int mod_op) +ldapGroupCheck (int mod_op, LDAP * ld) { int op = 0; if (mod_op == LDAP_MOD_ADD) @@ -126,11 +126,11 @@ ldapGroupCheck (int mod_op) groupMod = ldapBuildList (op, "objectClass", globalLdap->group_object_class, groupMod); groupMod = - ldapBuildListStr (LDAP_MOD_ADD, "cn", ldapGetCn (), groupMod); + ldapBuildListStr (ld, LDAP_MOD_ADD, "cn", ldapGetCn (), groupMod); } if (globalLdap->passent->pw_passwd) - groupMod = ldapBuildListStr (op, "userPassword", + groupMod = ldapBuildListStr (ld, op, "userPassword", globalLdap->passent->pw_passwd, groupMod); if ((int) globalLdap->passent->pw_gid > -1) @@ -143,7 +143,7 @@ ldapGroupCheck (int mod_op) pos = globalLdap->parse; while (pos != NULL) { - groupMod = ldapBuildListStr (op, pos->attr, pos->attrval, groupMod); + groupMod = ldapBuildListStr (ld, op, pos->attr, pos->attrval, groupMod); pos = pos->next; } } diff -up cpu-1.4.3/src/plugins/ldap/ld.c.mod-delete cpu-1.4.3/src/plugins/ldap/ld.c --- cpu-1.4.3/src/plugins/ldap/ld.c.mod-delete 2010-11-05 23:53:41.000000000 -0600 +++ cpu-1.4.3/src/plugins/ldap/ld.c 2010-11-06 00:03:17.000000000 -0600 @@ -278,7 +278,7 @@ ldapAddList (LDAPMod ** mods) } LDAPMod ** -ldapBuildListStr (int mod_op, char *mod_type, char *value, LDAPMod ** mods) +ldapBuildListStr (LDAP * ld, int mod_op, char *mod_type, char *value, LDAPMod ** mods) { char **temp; @@ -286,19 +286,66 @@ ldapBuildListStr (int mod_op, char *mod_ return mods; if (value == NULL || strlen(value) == strspn(value, " ")) - return mods; - - mods = ldapAddList (mods); + { + int strsize = 1; + char *filter = NULL; + int ldapres = 0; + int err = 0; + + LDAPMessage *res[2]; + res[1] = NULL; + + strsize = strlen (mod_type) + 5; + filter = (char *) malloc (sizeof (char) * strsize); + if (filter == NULL) + return -1; + bzero (filter, strsize); + snprintf (filter, strsize, "(%s=*)", mod_type); + if (ldap_search_st (ld, globalLdap->dn, LDAP_SCOPE_BASE, filter, NULL, 0, + &globalLdap->timeout, res) != LDAP_SUCCESS) + { + if (ldap_get_option (ld, LDAP_OPT_ERROR_NUMBER, &err) < 0) + { + fprintf (stderr, "Error in ldap_get_option\n"); + return -1; + } + if (err != LDAP_NO_SUCH_OBJECT) + { + CPU_ldapPerror (ld, globalLdap, + "ldapBuildListStr: ldap_search_st"); + return -1; + } + } + else + { + ldapres = ldap_count_entries (ld, res[0]); + if (ldapres > 0) + { + mods = ldapAddList (mods); + + mods[list_size]->mod_op = LDAP_MOD_DELETE; + mods[list_size]->mod_type = strdup (mod_type); + mods[list_size]->mod_values = NULL; + list_size++; + } + } + free(filter); + } + else + { + mods = ldapAddList (mods); - temp = (char **) malloc (sizeof (char *) * 2); - bzero (temp, sizeof (char *) * 2); - temp[0] = value; - temp[1] = NULL; + temp = (char **) malloc (sizeof (char *) * 2); + bzero (temp, sizeof (char *) * 2); + temp[0] = value; + temp[1] = NULL; + + mods[list_size]->mod_op = mod_op; + mods[list_size]->mod_type = strdup (mod_type); + mods[list_size]->mod_values = temp; + list_size++; + } - mods[list_size]->mod_op = mod_op; - mods[list_size]->mod_type = strdup (mod_type); - mods[list_size]->mod_values = temp; - list_size++; return mods; } diff -up cpu-1.4.3/src/plugins/ldap/user.c.mod-delete cpu-1.4.3/src/plugins/ldap/user.c --- cpu-1.4.3/src/plugins/ldap/user.c.mod-delete 2010-11-05 23:53:41.000000000 -0600 +++ cpu-1.4.3/src/plugins/ldap/user.c 2010-11-05 23:54:19.000000000 -0600 @@ -251,16 +251,16 @@ ldapUserCheck (int mod_op, LDAP * ld) */ if (op == LDAP_MOD_ADD) { - userMod = ldapBuildListStr (LDAP_MOD_ADD, "cn", ldapGetCn (), userMod); + userMod = ldapBuildListStr (ld, LDAP_MOD_ADD, "cn", ldapGetCn (), userMod); userMod = ldapBuildList (op, "objectClass", globalLdap->user_object_class, userMod); } else if (globalLdap->passent->pw_gecos || (globalLdap->first_name && globalLdap->last_name)) - userMod = ldapBuildListStr (op, "cn", ldapGetCn (), userMod); + userMod = ldapBuildListStr (ld, op, "cn", ldapGetCn (), userMod); userMod = - ldapBuildListStr (op, "uid", globalLdap->passent->pw_name, userMod); + ldapBuildListStr (ld, op, "uid", globalLdap->passent->pw_name, userMod); /* do we allow duplicates ? */ if ((int) globalLdap->passent->pw_uid > -1) @@ -433,35 +433,35 @@ ldapUserCheck (int mod_op, LDAP * ld) } if (globalLdap->first_name) userMod = - ldapBuildListStr (op, "givenName", globalLdap->first_name, userMod); + ldapBuildListStr (ld, op, "givenName", globalLdap->first_name, userMod); if (globalLdap->last_name) - userMod = ldapBuildListStr (op, "sn", globalLdap->last_name, userMod); + userMod = ldapBuildListStr (ld, op, "sn", globalLdap->last_name, userMod); if (globalLdap->new_username) - userMod = ldapBuildListStr (op, "uid", globalLdap->new_username, userMod); + userMod = ldapBuildListStr (ld, op, "uid", globalLdap->new_username, userMod); if (globalLdap->email_address) userMod = - ldapBuildListStr (op, "mail", globalLdap->email_address, userMod); + ldapBuildListStr (ld, op, "mail", globalLdap->email_address, userMod); if (globalLdap->passent->pw_passwd) userMod = - ldapBuildListStr (op, "userPassword", globalLdap->passent->pw_passwd, + ldapBuildListStr (ld, op, "userPassword", globalLdap->passent->pw_passwd, userMod); if (globalLdap->passent->pw_gecos) - userMod = ldapBuildListStr (op, "gecos", globalLdap->passent->pw_gecos, + userMod = ldapBuildListStr (ld, op, "gecos", globalLdap->passent->pw_gecos, userMod); if (globalLdap->passent->pw_dir) userMod = - ldapBuildListStr (op, "homeDirectory", globalLdap->passent->pw_dir, + ldapBuildListStr (ld, op, "homeDirectory", globalLdap->passent->pw_dir, userMod); if (globalLdap->passent->pw_shell) userMod = - ldapBuildListStr (op, "loginShell", globalLdap->passent->pw_shell, + ldapBuildListStr (ld, op, "loginShell", globalLdap->passent->pw_shell, userMod); if ((int) globalLdap->passent->sp_lstchg != -10) userMod = ldapBuildListInt (op, "shadowLastChange", @@ -501,7 +501,7 @@ ldapUserCheck (int mod_op, LDAP * ld) pos = globalLdap->parse; while (pos != NULL) { - userMod = ldapBuildListStr (op, pos->attr, pos->attrval, userMod); + userMod = ldapBuildListStr (ld, op, pos->attr, pos->attrval, userMod); pos = pos->next; } } diff -up cpu-1.4.3/src/util/parser.c.mod-delete cpu-1.4.3/src/util/parser.c --- cpu-1.4.3/src/util/parser.c.mod-delete 2010-11-07 16:05:19.000000000 -0700 +++ cpu-1.4.3/src/util/parser.c 2010-11-07 16:13:07.000000000 -0700 @@ -290,11 +290,7 @@ p->cont = true; token = getToken(&cart[i], delim); if ( token == NULL ) - { - printf("%d: Malformed file, cannot continue parsing.\n", - __LINE__); - return NULL; - } + token = strdup (""); } p->attrval = delWhite(&token); pos = parse;