diff options
Diffstat (limited to 'ldap/servers/slapd/back-ldbm/vlv.c')
-rw-r--r-- | ldap/servers/slapd/back-ldbm/vlv.c | 78 |
1 files changed, 55 insertions, 23 deletions
diff --git a/ldap/servers/slapd/back-ldbm/vlv.c b/ldap/servers/slapd/back-ldbm/vlv.c index 2402017d..2f2cb48e 100644 --- a/ldap/servers/slapd/back-ldbm/vlv.c +++ b/ldap/servers/slapd/back-ldbm/vlv.c @@ -339,7 +339,7 @@ vlv_init(ldbm_instance *inst) /* The FE DSE *must* be initialised before we get here */ int return_value= LDAP_SUCCESS; int scope= LDAP_SCOPE_SUBTREE; - char *basedn, buf[512]; + char *basedn = NULL; const char *searchfilter = "(objectclass=vlvsearch)"; const char *indexfilter = "(objectclass=vlvindex)"; backend *be= inst->inst_be; @@ -368,9 +368,15 @@ vlv_init(ldbm_instance *inst) if (inst == NULL) { basedn = NULL; } else { - PR_snprintf(buf, sizeof(buf), "cn=%s,cn=%s,cn=plugins,cn=config", - inst->inst_name, inst->inst_li->li_plugin->plg_name); - basedn = buf; + basedn = slapi_create_dn_string("cn=%s,cn=%s,cn=plugins,cn=config", + inst->inst_name, inst->inst_li->li_plugin->plg_name); + if (NULL == basedn) { + LDAPDebug2Args(LDAP_DEBUG_ANY, + "vlv_init: failed to create vlv dn for plugin %s, instance %s\n", + inst->inst_name, inst->inst_li->li_plugin->plg_name); + return_value = LDAP_PARAM_ERROR; + return return_value; + } } /* Find the VLV Search Entries */ @@ -405,6 +411,7 @@ vlv_init(ldbm_instance *inst) slapi_config_register_callback(SLAPI_OPERATION_DELETE,DSE_FLAG_PREOP,basedn,scope,indexfilter,vlv_DeleteIndexEntry,(void*)inst); slapi_config_register_callback(SLAPI_OPERATION_MODRDN,DSE_FLAG_PREOP,basedn,scope,searchfilter,vlv_ModifyRDNSearchEntry,(void*)inst); slapi_config_register_callback(SLAPI_OPERATION_MODRDN,DSE_FLAG_PREOP,basedn,scope,indexfilter,vlv_ModifyRDNIndexEntry,(void*)inst); + slapi_ch_free_string(&basedn); } return return_value; @@ -417,16 +424,22 @@ vlv_remove_callbacks(ldbm_instance *inst) { int return_value= LDAP_SUCCESS; int scope= LDAP_SCOPE_SUBTREE; - char *basedn, buf[512]; + char *basedn = NULL; const char *searchfilter = "(objectclass=vlvsearch)"; const char *indexfilter = "(objectclass=vlvindex)"; if (inst == NULL) { basedn = NULL; } else { - PR_snprintf(buf, sizeof(buf), "cn=%s,cn=%s,cn=plugins,cn=config", - inst->inst_name, inst->inst_li->li_plugin->plg_name); - basedn = buf; + basedn = slapi_create_dn_string("cn=%s,cn=%s,cn=plugins,cn=config", + inst->inst_name, inst->inst_li->li_plugin->plg_name); + if (NULL == basedn) { + LDAPDebug2Args(LDAP_DEBUG_ANY, + "vlv_remove_callbacks: failed to create vlv dn for plugin %s, " + "instance %s\n", + inst->inst_name, inst->inst_li->li_plugin->plg_name); + return_value = LDAP_PARAM_ERROR; + } } if(basedn!=NULL) { @@ -439,8 +452,9 @@ vlv_remove_callbacks(ldbm_instance *inst) { slapi_config_remove_callback(SLAPI_OPERATION_DELETE,DSE_FLAG_PREOP,basedn,scope,indexfilter,vlv_DeleteIndexEntry); slapi_config_remove_callback(SLAPI_OPERATION_MODRDN,DSE_FLAG_PREOP,basedn,scope,searchfilter,vlv_ModifyRDNSearchEntry); slapi_config_remove_callback(SLAPI_OPERATION_MODRDN,DSE_FLAG_PREOP,basedn,scope,indexfilter,vlv_ModifyRDNIndexEntry); + slapi_ch_free_string(&basedn); } - return return_value; + return return_value; } /* Find an enabled index which matches this description. */ @@ -1980,17 +1994,13 @@ char *create_vlv_search_tag(const char* dn) { /* Builds strings from Slapi_DN similar console GUI. Uses those dns to delete vlvsearch's if they match. New write lock. */ - -#define LDBM_PLUGIN_ROOT ", cn=ldbm database, cn=plugins, cn=config" -#define TAG "cn=by MCC " - int vlv_delete_search_entry(Slapi_PBlock *pb, Slapi_Entry* e, ldbm_instance *inst) { int rc=0; Slapi_PBlock *tmppb; Slapi_DN *newdn; struct vlvSearch* p=NULL; - char *buf, *buf2, *tag1, *tag2; + char *base1 = NULL, *base2 = NULL, *tag1 = NULL, *tag2 = NULL; const char *dn= slapi_sdn_get_dn(&e->e_sdn); backend *be= NULL; if (NULL == inst) { @@ -2007,8 +2017,18 @@ int vlv_delete_search_entry(Slapi_PBlock *pb, Slapi_Entry* e, ldbm_instance *ins return LDAP_OPERATIONS_ERROR; } tag1=create_vlv_search_tag(dn); - buf=slapi_ch_smprintf("%s%s%s%s%s","cn=MCC ",tag1,", cn=",inst->inst_name,LDBM_PLUGIN_ROOT); - newdn=slapi_sdn_new_dn_byval(buf); + base1 = slapi_create_dn_string("cn=MCC %s,cn=%s,cn=%s,cn=plugins,cn=config", + tag1, inst->inst_name, inst->inst_li->li_plugin->plg_name); + if (NULL == base1) { + LDAPDebug(LDAP_DEBUG_ANY, + "vlv_delete_search_entry: " + "failed to craete vlv search entry dn (rdn: cn=MCC %s) for " + "plugin %s, instance %s\n", + tag1, inst->inst_li->li_plugin->plg_name, inst->inst_name); + rc = LDAP_PARAM_ERROR; + goto bail; + } + newdn = slapi_sdn_new_dn_byval(base1); /* vlvSearchList is modified; need Wlock */ PR_RWLock_Wlock(be->vlvSearchList_lock); p = vlvSearch_finddn((struct vlvSearch *)be->vlvSearchList, newdn); @@ -2016,37 +2036,49 @@ int vlv_delete_search_entry(Slapi_PBlock *pb, Slapi_Entry* e, ldbm_instance *ins { LDAPDebug( LDAP_DEBUG_ANY, "Deleted Virtual List View Search (%s).\n", p->vlv_name, 0, 0); tag2=create_vlv_search_tag(dn); - buf2=slapi_ch_smprintf("%s%s,%s",TAG,tag2,buf); + base2 = slapi_create_dn_string("cn=by MCC %s,%s", tag2, base1); + if (NULL == base2) { + LDAPDebug(LDAP_DEBUG_ANY, + "vlv_delete_search_entry: failed to create " + "vlv search entry dn (rdn: cn=by MCC %s) for " + "plugin %s, instance %s\n", + tag2, inst->inst_li->li_plugin->plg_name, inst->inst_name); + rc = LDAP_PARAM_ERROR; + slapi_ch_free((void **)&tag2); + PR_RWLock_Unlock(be->vlvSearchList_lock); + goto bail; + } vlvSearch_removefromlist((struct vlvSearch **)&be->vlvSearchList,p->vlv_dn); /* This line release lock to prevent recursive deadlock caused by slapi_internal_delete calling vlvDeleteSearchEntry */ PR_RWLock_Unlock(be->vlvSearchList_lock); vlvSearch_delete(&p); tmppb = slapi_pblock_new(); - slapi_delete_internal_set_pb(tmppb, buf2, NULL, NULL, + slapi_delete_internal_set_pb(tmppb, base2, NULL, NULL, (void *)plugin_get_default_component_id(), 0); slapi_delete_internal_pb(tmppb); slapi_pblock_get (tmppb, SLAPI_PLUGIN_INTOP_RESULT, &rc); if(rc != LDAP_SUCCESS) { - LDAPDebug(LDAP_DEBUG_ANY, "vlv_delete_search_entry:can't delete dse entry '%s'\n", buf2, 0, 0); + LDAPDebug(LDAP_DEBUG_ANY, "vlv_delete_search_entry:can't delete dse entry '%s'\n", base2, 0, 0); } pblock_done(tmppb); pblock_init(tmppb); - slapi_delete_internal_set_pb(tmppb, buf, NULL, NULL, + slapi_delete_internal_set_pb(tmppb, base1, NULL, NULL, (void *)plugin_get_default_component_id(), 0); slapi_delete_internal_pb(tmppb); slapi_pblock_get (tmppb, SLAPI_PLUGIN_INTOP_RESULT, &rc); if(rc != LDAP_SUCCESS) { - LDAPDebug(LDAP_DEBUG_ANY, "vlv_delete_search_entry:can't delete dse entry '%s'\n", buf, 0, 0); + LDAPDebug(LDAP_DEBUG_ANY, "vlv_delete_search_entry:can't delete dse entry '%s'\n", base1, 0, 0); } slapi_pblock_destroy(tmppb); slapi_ch_free((void **)&tag2); - slapi_ch_free((void **)&buf2); + slapi_ch_free((void **)&base2); } else { PR_RWLock_Unlock(be->vlvSearchList_lock); } +bail: instance_set_not_busy(inst); slapi_ch_free((void **)&tag1); - slapi_ch_free((void **)&buf); + slapi_ch_free((void **)&base1); slapi_sdn_free(&newdn); return rc; } |