ldap/servers/plugins/acctpolicy/acct_plugin.c | 11 ldap/servers/plugins/acl/acl.c | 46 - ldap/servers/plugins/acl/acl.h | 2 ldap/servers/plugins/acl/acl_ext.c | 8 ldap/servers/plugins/acl/acleffectiverights.c | 30 ldap/servers/plugins/acl/acllas.c | 49 - ldap/servers/plugins/acl/acllist.c | 43 ldap/servers/plugins/acl/aclparse.c | 20 ldap/servers/plugins/acl/aclplugin.c | 8 ldap/servers/plugins/automember/automember.c | 90 -- ldap/servers/plugins/chainingdb/cb_add.c | 29 ldap/servers/plugins/chainingdb/cb_bind.c | 61 - ldap/servers/plugins/chainingdb/cb_compare.c | 46 - ldap/servers/plugins/chainingdb/cb_controls.c | 6 ldap/servers/plugins/chainingdb/cb_delete.c | 43 ldap/servers/plugins/chainingdb/cb_instance.c | 24 ldap/servers/plugins/chainingdb/cb_modify.c | 55 - ldap/servers/plugins/chainingdb/cb_modrdn.c | 92 +- ldap/servers/plugins/chainingdb/cb_search.c | 120 +- ldap/servers/plugins/chainingdb/cb_utils.c | 2 ldap/servers/plugins/cos/cos_cache.c | 660 +++++++-------- ldap/servers/plugins/dna/dna.c | 62 - ldap/servers/plugins/linkedattrs/fixup_task.c | 16 ldap/servers/plugins/linkedattrs/linked_attrs.c | 48 - ldap/servers/plugins/linkedattrs/linked_attrs.h | 2 ldap/servers/plugins/memberof/memberof.c | 23 ldap/servers/plugins/mep/mep.c | 167 +-- ldap/servers/plugins/pam_passthru/pam_passthru.h | 2 ldap/servers/plugins/pam_passthru/pam_ptconfig.c | 2 ldap/servers/plugins/pam_passthru/pam_ptimpl.c | 16 ldap/servers/plugins/pam_passthru/pam_ptpreop.c | 9 ldap/servers/plugins/passthru/passthru.h | 4 ldap/servers/plugins/passthru/ptbind.c | 6 ldap/servers/plugins/passthru/ptconn.c | 8 ldap/servers/plugins/passthru/ptpreop.c | 17 ldap/servers/plugins/referint/referint.c | 159 +-- ldap/servers/plugins/replication/cl4_api.c | 2 ldap/servers/plugins/replication/cl5_api.c | 80 - ldap/servers/plugins/replication/cl5_test.c | 2 ldap/servers/plugins/replication/legacy_consumer.c | 14 ldap/servers/plugins/replication/repl.h | 2 ldap/servers/plugins/replication/repl5.h | 3 ldap/servers/plugins/replication/repl5_agmt.c | 15 ldap/servers/plugins/replication/repl5_agmtlist.c | 22 ldap/servers/plugins/replication/repl5_inc_protocol.c | 12 ldap/servers/plugins/replication/repl5_init.c | 4 ldap/servers/plugins/replication/repl5_mtnode_ext.c | 13 ldap/servers/plugins/replication/repl5_plugins.c | 2 ldap/servers/plugins/replication/repl5_replica.c | 26 ldap/servers/plugins/replication/repl5_replica_config.c | 14 ldap/servers/plugins/replication/repl5_updatedn_list.c | 2 ldap/servers/plugins/replication/repl_bind.c | 6 ldap/servers/plugins/replication/repl_compare.c | 17 ldap/servers/plugins/replication/repl_connext.c | 2 ldap/servers/plugins/replication/repl_extop.c | 25 ldap/servers/plugins/replication/replutil.c | 22 ldap/servers/plugins/replication/urp.c | 105 +- ldap/servers/plugins/replication/urp.h | 2 ldap/servers/plugins/replication/urp_glue.c | 4 ldap/servers/plugins/replication/urp_tombstone.c | 6 ldap/servers/plugins/replication/windows_connection.c | 2 ldap/servers/plugins/replication/windows_private.c | 16 ldap/servers/plugins/replication/windows_protocol_util.c | 50 - ldap/servers/plugins/retrocl/retrocl_po.c | 8 ldap/servers/plugins/roles/roles_cache.c | 10 ldap/servers/plugins/statechange/statechange.c | 19 ldap/servers/plugins/uiduniq/7bit.c | 41 ldap/servers/plugins/uiduniq/uid.c | 137 +-- ldap/servers/plugins/views/views.c | 11 ldap/servers/slapd/add.c | 64 - ldap/servers/slapd/auditlog.c | 25 ldap/servers/slapd/auth.c | 40 ldap/servers/slapd/back-ldbm/ancestorid.c | 73 + ldap/servers/slapd/back-ldbm/dblayer.c | 2 ldap/servers/slapd/back-ldbm/dn2entry.c | 27 ldap/servers/slapd/back-ldbm/findentry.c | 31 ldap/servers/slapd/back-ldbm/id2entry.c | 20 ldap/servers/slapd/back-ldbm/idl_common.c | 6 ldap/servers/slapd/back-ldbm/import-threads.c | 74 - ldap/servers/slapd/back-ldbm/index.c | 2 ldap/servers/slapd/back-ldbm/instance.c | 1 ldap/servers/slapd/back-ldbm/ldbm_add.c | 61 - ldap/servers/slapd/back-ldbm/ldbm_config.c | 30 ldap/servers/slapd/back-ldbm/ldbm_delete.c | 16 ldap/servers/slapd/back-ldbm/ldbm_entryrdn.c | 4 ldap/servers/slapd/back-ldbm/ldbm_instance_config.c | 21 ldap/servers/slapd/back-ldbm/ldbm_modify.c | 2 ldap/servers/slapd/back-ldbm/ldbm_modrdn.c | 125 +- ldap/servers/slapd/back-ldbm/ldbm_search.c | 87 + ldap/servers/slapd/back-ldbm/ldif2ldbm.c | 53 - ldap/servers/slapd/back-ldbm/misc.c | 3 ldap/servers/slapd/back-ldbm/vlv_srch.c | 2 ldap/servers/slapd/bind.c | 79 - ldap/servers/slapd/bulk_import.c | 39 ldap/servers/slapd/charray.c | 21 ldap/servers/slapd/compare.c | 36 ldap/servers/slapd/delete.c | 77 - ldap/servers/slapd/dn.c | 403 ++++++--- ldap/servers/slapd/dse.c | 98 -- ldap/servers/slapd/entry.c | 203 ++-- ldap/servers/slapd/extendop.c | 21 ldap/servers/slapd/fedse.c | 2 ldap/servers/slapd/libglobs.c | 5 ldap/servers/slapd/main.c | 16 ldap/servers/slapd/mapping_tree.c | 82 + ldap/servers/slapd/modify.c | 126 +- ldap/servers/slapd/modrdn.c | 254 +++-- ldap/servers/slapd/modutil.c | 17 ldap/servers/slapd/operation.c | 25 ldap/servers/slapd/opshared.c | 123 +- ldap/servers/slapd/passwd_extop.c | 152 +-- ldap/servers/slapd/pblock.c | 120 ++ ldap/servers/slapd/plugin.c | 80 - ldap/servers/slapd/plugin_acl.c | 19 ldap/servers/slapd/plugin_internal_op.c | 131 +- ldap/servers/slapd/plugin_syntax.c | 10 ldap/servers/slapd/proto-slap.h | 2 ldap/servers/slapd/proxyauth.c | 15 ldap/servers/slapd/psearch.c | 64 - ldap/servers/slapd/pw.c | 41 ldap/servers/slapd/pw_mgmt.c | 16 ldap/servers/slapd/pw_retry.c | 51 - ldap/servers/slapd/rdn.c | 23 ldap/servers/slapd/referral.c | 25 ldap/servers/slapd/result.c | 10 ldap/servers/slapd/saslbind.c | 25 ldap/servers/slapd/search.c | 42 ldap/servers/slapd/slap.h | 5 ldap/servers/slapd/slapi-plugin.h | 254 +++++ ldap/servers/slapd/slapi-private.h | 11 ldap/servers/slapd/task.c | 32 ldap/servers/slapd/tools/ldclt/ldapfct.c | 5 ldap/servers/slapd/util.c | 49 - ldap/servers/slapd/uuid.c | 3 ldap/servers/slapd/value.c | 27 lib/libaccess/lasdns.cpp | 8 136 files changed, 3483 insertions(+), 2815 deletions(-)
New commits: commit f6397113666f06848412bb12f754f04258cfa5fa Author: Noriko Hosoi nhosoi@redhat.com Date: Wed Oct 19 16:51:48 2011 -0700
Reduce the number of DN normalization
. Adding SLAPI_TARGET_SDN as well as its macros, SLAPI_SEARCH_TARGET_ SDN SLAPI_ADD_TARGET_SDN, SLAPI_MODIFY_TARGET_SDN, etc. . Adding SLAPI_MODRDN_NEWSUPERIOR_SDN. . SLAPI_TARGET_DN and SLAPI_MODRDN_NEWSUPERIOR are kept for the back- ward compatibility. But they are marked as deprecated. They are pointing dn in SLAPI_TARGET_SDN and SLAPI_MODRDN_NEWSUPERIOR_SDN, respectively. . slapi_pblock_set(.., SLAPI_TARGET_DN/SLAPI_MODRDN_NEWSUPERIOR, dn) takes dn string and reset Slapi_DN to SLAPI_TARGET_SDN/SLAPI_MODRDN_ NEWSUPERIOR_SDN. . slapi_pblock_get(.., SLAPI_TARGET_DN/SLAPI_MODRDN_NEWSUPERIOR, &dn) retrieves dn out of SLAPI_TARGET_SDN/SLAPI_MODRDN_NEWSUPERIOR_SDN. . Replacing slapi_dn_normalization_ext call with generating Slapi_DN APIs (e.g., slapi_sdn_new_dn_...) as much as possible and stash it in pblock using SLAPI_TARGET_SDN. . When a normalized DN string is needed, get it using slapi_sdn_get_[n]dn from the stashed Slapi_DN. . Introduced a new field "udn" to Slapi_DN. "udn" is an original DN. "dn" is its normalized DN. "ndn" is its case-lowered normalized DN. Note: slapi_sdn_get_ndn_len represents the length of the normalized DN, which is "dn" as well as "ndn". Thus, instead of calling strlen for the normalized dn, using slapi_sdn_get_ndn_len, as much as possible. . Taking advantage of the knowledge of the stage of the DN, call the most efficient DN creating API (e.g., slapi_sdn_new_dn_... vs. slapi_sdn_new_normdn_... vs. slapi_sdn_new_ndn_...)
Others . Replacing inefficient array assignment with memset (acl.c) and memcpy (idl_common.c). . Fixing invalid memory access in LASDnsBuild (lib/libaccess/lasdns.cpp). . Fixing compiler warnings.
Reviewed by rmeggins@redhat.com (Thank you, Rich!!)
diff --git a/ldap/servers/plugins/acctpolicy/acct_plugin.c b/ldap/servers/plugins/acctpolicy/acct_plugin.c index 6d9edb3..5969bec 100644 --- a/ldap/servers/plugins/acctpolicy/acct_plugin.c +++ b/ldap/servers/plugins/acctpolicy/acct_plugin.c @@ -32,7 +32,7 @@ Hewlett-Packard Development Company, L.P. login time plus the limit to decide whether to deny the bind. */ static int -acct_inact_limit( Slapi_PBlock *pb, char *dn, Slapi_Entry *target_entry, acctPolicy *policy ) +acct_inact_limit( Slapi_PBlock *pb, const char *dn, Slapi_Entry *target_entry, acctPolicy *policy ) { char *lasttimestr = NULL; time_t lim_t, last_t, cur_t; @@ -153,7 +153,7 @@ done: int acct_bind_preop( Slapi_PBlock *pb ) { - char *dn = NULL; + const char *dn = NULL; Slapi_DN *sdn = NULL; Slapi_Entry *target_entry = NULL; int rc = 0; /* Optimistic default */ @@ -167,20 +167,19 @@ acct_bind_preop( Slapi_PBlock *pb ) plugin_id = get_identity();
/* This does not give a copy, so don't free it */ - if( slapi_pblock_get( pb, SLAPI_BIND_TARGET, &dn ) != 0 ) { + if( slapi_pblock_get( pb, SLAPI_BIND_TARGET_SDN, &sdn ) != 0 ) { slapi_log_error( SLAPI_LOG_FATAL, PRE_PLUGIN_NAME, "Error retrieving target DN\n" ); rc = -1; goto done; } + dn = slapi_sdn_get_dn(sdn);
/* The plugin wouldn't get called for anonymous binds but let's check */ if ( dn == NULL ) { goto done; }
- sdn = slapi_sdn_new_dn_byref( dn ); - ldrc = slapi_search_internal_get_entry( sdn, NULL, &target_entry, plugin_id );
@@ -222,8 +221,6 @@ done:
slapi_entry_free( target_entry );
- slapi_sdn_free( &sdn ); - free_acctpolicy( &policy );
slapi_log_error( SLAPI_LOG_PLUGIN, PRE_PLUGIN_NAME, diff --git a/ldap/servers/plugins/acl/acl.c b/ldap/servers/plugins/acl/acl.c index 657c5ec..0ae1a24 100644 --- a/ldap/servers/plugins/acl/acl.c +++ b/ldap/servers/plugins/acl/acl.c @@ -95,8 +95,8 @@ static void print_access_control_summary( char * source, char *attr, const char *edn, aclResultReason_t *acl_reason); -static int check_rdn_access( Slapi_PBlock *pb,Slapi_Entry *e, char * newrdn, - int access); +static int check_rdn_access( Slapi_PBlock *pb, Slapi_Entry *e, + const char * newrdn, int access);
/* @@ -117,7 +117,9 @@ acl_access_allowed_modrdn( ) { int retCode ; - char *newrdn, *oldrdn; + char *newrdn; + const char *oldrdn; + Slapi_DN *target_sdn = NULL; int deleteoldrdn = 0;
/* @@ -134,9 +136,8 @@ acl_access_allowed_modrdn( }
/* Now get the new rdn attribute name and value */ - - slapi_pblock_get( pb, SLAPI_MODRDN_TARGET, &oldrdn ); - slapi_pblock_get( pb, SLAPI_MODRDN_NEWRDN, &newrdn ); + slapi_pblock_get( pb, SLAPI_MODRDN_TARGET_SDN, &target_sdn ); + slapi_pblock_get( pb, SLAPI_MODRDN_NEWRDN, &newrdn );
/* Check can add the new naming attribute */ retCode = check_rdn_access( pb, e, newrdn, ACLPB_SLAPI_ACL_WRITE_ADD) ; @@ -149,6 +150,7 @@ acl_access_allowed_modrdn( /* Check can delete the new naming attribute--if required */ slapi_pblock_get( pb, SLAPI_MODRDN_DELOLDRDN, &deleteoldrdn ); if ( deleteoldrdn ) { + oldrdn = slapi_sdn_get_dn(target_sdn); retCode = check_rdn_access( pb, e, oldrdn, ACLPB_SLAPI_ACL_WRITE_DEL) ; if ( retCode != LDAP_SUCCESS ) { slapi_log_error( SLAPI_LOG_ACL, plugin_name, @@ -164,7 +166,7 @@ acl_access_allowed_modrdn( * Test if have access to make the first rdn of dn in entry e. */
-static int check_rdn_access( Slapi_PBlock *pb, Slapi_Entry *e, char *dn, +static int check_rdn_access( Slapi_PBlock *pb, Slapi_Entry *e, const char *dn, int access) { char **dns; @@ -320,7 +322,7 @@ acl_access_allowed( TNF_PROBE_0_DEBUG(acl_skipaccess_end,"ACL","");
- /* Get the bindDN */ + /* Get the bindDN (normalized & case-ignored) */ slapi_pblock_get ( pb, SLAPI_REQUESTOR_DN, &clientDn );
/* Initialize aclpb */ @@ -486,7 +488,7 @@ acl_access_allowed( TNF_PROBE_0_DEBUG(acl_aciscan_start,"ACL",""); slapi_sdn_done ( aclpb->aclpb_curr_entry_sdn ); - slapi_sdn_set_dn_byval ( aclpb->aclpb_curr_entry_sdn, n_edn ); + slapi_sdn_set_ndn_byval ( aclpb->aclpb_curr_entry_sdn, n_edn ); acllist_aciscan_update_scan ( aclpb, n_edn ); TNF_PROBE_0_DEBUG(acl_aciscan_end,"ACL","");
@@ -1064,16 +1066,14 @@ acl_read_access_allowed_on_entry ( * which was found in the entry and that attribute is * now in aclpb_Evalattr */ - aclpb->aclpb_state |= - ACLPB_ACCESS_ALLOWED_USERATTR; + aclpb->aclpb_state |= ACLPB_ACCESS_ALLOWED_USERATTR; } else { #endif /* DETERMINE_ACCESS_BASED_ON_REQUESTED_ATTRIBUTES */ /* * Access was granted to _an_ attribute in the entry and that * attribute is now in aclpb_Evalattr */ - aclpb->aclpb_state |= - ACLPB_ACCESS_ALLOWED_ON_A_ATTR; + aclpb->aclpb_state |= ACLPB_ACCESS_ALLOWED_ON_A_ATTR; #ifdef DETERMINE_ACCESS_BASED_ON_REQUESTED_ATTRIBUTES } #endif /* DETERMINE_ACCESS_BASED_ON_REQUESTED_ATTRIBUTES */ @@ -1084,8 +1084,8 @@ acl_read_access_allowed_on_entry ( } else { /* try the next one */ attr_type = NULL; -#ifdef DETERMINE_ACCESS_BASED_ON_REQUESTED_ATTRIBUTES - if (attr_index >= 0) { +#ifdef DETERMINE_ACCESS_BASED_ON_REQUESTED_ATTRIBUTES + if (attr_index >= 0) { attr_type = attrs[attr_index++]; } else { #endif /* DETERMINE_ACCESS_BASED_ON_REQUESTED_ATTRIBUTES */ @@ -1546,7 +1546,7 @@ acl_modified (Slapi_PBlock *pb, int optype, char *n_dn, void *change) Slapi_DN *e_sdn; aclUserGroup *ugroup = NULL; - e_sdn = slapi_sdn_new_ndn_byval ( n_dn ); + e_sdn = slapi_sdn_new_normdn_byval ( n_dn ); /* Before we proceed, Let's first check if we are changing any groups. ** If we are, then we need to change the signature */ @@ -1836,7 +1836,6 @@ acl__scan_for_acis(Acl_PBlock *aclpb, int *err) int allow_handle; int gen_allow_handle = ACI_MAX_ELEVEL+1; int gen_deny_handle = ACI_MAX_ELEVEL+1; - int i; PRUint32 cookie; TNF_PROBE_0_DEBUG(acl__scan_for_acis_start,"ACL",""); @@ -1849,20 +1848,18 @@ acl__scan_for_acis(Acl_PBlock *aclpb, int *err) aclpb->aclpb_handles_index[0] != -1 ) { int kk = 0; while ( kk < ACLPB_MAX_SELECTED_ACLS && aclpb->aclpb_handles_index[kk] != -1 ) { - slapi_log_error(SLAPI_LOG_ACL, plugin_name, "Using ACL Cointainer:%d for evaluation\n", kk); + slapi_log_error(SLAPI_LOG_ACL, plugin_name, "Using ACL Container:%d for evaluation\n", kk); kk++; } } - + memset (&errp, 0, sizeof(NSErr_t)); *err = ACL_FALSE; aclpb->aclpb_num_deny_handles = -1; aclpb->aclpb_num_allow_handles = -1; - for (i=0; i <= ACI_MAX_ELEVEL; i++) { - aclpb->aclpb_deny_handles [i] = NULL; - aclpb->aclpb_allow_handles [i] = NULL; - } - + memset(aclpb->aclpb_deny_handles, 0, sizeof(aci_t *)*(ACI_MAX_ELEVEL+1)); + memset(aclpb->aclpb_allow_handles, 0, sizeof(aci_t *)*(ACI_MAX_ELEVEL+1)); + /* Check the signature. If it has changed, start fresh */ if ( aclpb->aclpb_signature != acl_signature ) { slapi_log_error (SLAPI_LOG_ACL, plugin_name, @@ -1873,7 +1870,6 @@ acl__scan_for_acis(Acl_PBlock *aclpb, int *err) attr_matched = ACL_FALSE; deny_handle = 0; allow_handle = 0; - i = 0;
aclpb->aclpb_stat_acllist_scanned++; aci = acllist_get_first_aci ( aclpb, &cookie ); diff --git a/ldap/servers/plugins/acl/acl.h b/ldap/servers/plugins/acl/acl.h index 0d97769..8747de1 100644 --- a/ldap/servers/plugins/acl/acl.h +++ b/ldap/servers/plugins/acl/acl.h @@ -838,7 +838,7 @@ void aclutil_print_resource( struct acl_pblock *aclpb, char *right , char *attr char * aclutil_expand_paramString ( char *str, Slapi_Entry *e );
-void acllist_init_scan (Slapi_PBlock *pb, int scope, char *base); +void acllist_init_scan (Slapi_PBlock *pb, int scope, const char *base); aci_t * acllist_get_first_aci (Acl_PBlock *aclpb, PRUint32 *cookie ); aci_t * acllist_get_next_aci ( Acl_PBlock *aclpb, aci_t *curraci, PRUint32 *cookie ); aci_t * acllist_get_aci_new (); diff --git a/ldap/servers/plugins/acl/acl_ext.c b/ldap/servers/plugins/acl/acl_ext.c index 61d8dd1..df7d1ed 100644 --- a/ldap/servers/plugins/acl/acl_ext.c +++ b/ldap/servers/plugins/acl/acl_ext.c @@ -658,7 +658,7 @@ error:
/* Initializes the aclpb */ void -acl_init_aclpb ( Slapi_PBlock *pb , Acl_PBlock *aclpb, const char *dn, int copy_from_aclcb) +acl_init_aclpb ( Slapi_PBlock *pb , Acl_PBlock *aclpb, const char *ndn, int copy_from_aclcb) { struct acl_cblock *aclcb = NULL; char *authType; @@ -685,8 +685,8 @@ acl_init_aclpb ( Slapi_PBlock *pb , Acl_PBlock *aclpb, const char *dn, int copy_ aclpb->aclpb_state = ACLPB_INITIALIZED;
/* We make an anonymous user a non null dn which is empty */ - if (dn && *dn != '\0' ) - slapi_sdn_set_ndn_byval ( aclpb->aclpb_authorization_sdn, dn ); + if (ndn && *ndn != '\0' ) + slapi_sdn_set_ndn_byval ( aclpb->aclpb_authorization_sdn, ndn ); else slapi_sdn_set_ndn_byval ( aclpb->aclpb_authorization_sdn, "" );
@@ -716,7 +716,7 @@ acl_init_aclpb ( Slapi_PBlock *pb , Acl_PBlock *aclpb, const char *dn, int copy_ slapi_pblock_get ( pb, SLAPI_CONN_CERT, &aclpb->aclpb_clientcert );
/* See if the we have already a cached info about user's group */ - aclg_init_userGroup ( aclpb, dn, 0 /* get lock */ ); + aclg_init_userGroup ( aclpb, ndn, 0 /* get lock */ );
slapi_pblock_get( pb, SLAPI_BE_MAXNESTLEVEL, &aclpb->aclpb_max_nesting_level ); slapi_pblock_get( pb, SLAPI_SEARCH_SIZELIMIT, &aclpb->aclpb_max_member_sizelimit ); diff --git a/ldap/servers/plugins/acl/acleffectiverights.c b/ldap/servers/plugins/acl/acleffectiverights.c index b596c8f..3d1f754 100644 --- a/ldap/servers/plugins/acl/acleffectiverights.c +++ b/ldap/servers/plugins/acl/acleffectiverights.c @@ -197,7 +197,6 @@ _ger_parse_control ( size_t subjectndnlen = 0; char *orig = NULL; char *normed = NULL; - int rc = 0;
if (NULL == subjectndn) { @@ -268,22 +267,17 @@ _ger_parse_control ( }
/* memmove is safe for overlapping copy */ - rc = slapi_dn_normalize_ext(orig + 3, 0, &normed, &subjectndnlen); - if (rc < 0) { - aclutil_str_append ( errbuf, "get-effective-rights: failed to normalize dn: "); - aclutil_str_append ( errbuf, orig); - slapi_log_error (SLAPI_LOG_FATAL, plugin_name, "%s\n", *errbuf ); + normed = slapi_create_dn_string("%s", orig + 3); + if (NULL == normed) { + aclutil_str_append (errbuf, "get-effective-rights: failed to normalize dn: "); + aclutil_str_append (errbuf, orig); + slapi_log_error (SLAPI_LOG_FATAL, plugin_name, "%s\n", *errbuf); slapi_ch_free_string(&orig); return LDAP_INVALID_SYNTAX; } - if (rc == 0) { /* orig+3 is passed in; not terminated */ - *(normed + subjectndnlen) = '\0'; - *subjectndn = slapi_ch_strdup(normed); - slapi_ch_free_string(&orig); - } else { - slapi_ch_free_string(&orig); - *subjectndn = normed; - } + slapi_ch_free_string(&orig); + *subjectndn = normed; + slapi_dn_ignore_case(*subjectndn); return LDAP_SUCCESS; }
@@ -839,7 +833,8 @@ _ger_generate_template_entry ( char *object = NULL; char *superior = NULL; char *p = NULL; - char *dn = NULL; + const char *dn = NULL; + Slapi_DN *sdn = NULL; char *dntype = NULL; int siz = 0; int len = 0; @@ -856,8 +851,6 @@ _ger_generate_template_entry ( rc = LDAP_SUCCESS; goto bailout; } - /* get the target dn where the template entry is located */ - slapi_pblock_get( pb, SLAPI_TARGET_DN, &dn ); for (i = 0; gerattrs && gerattrs[i]; i++) { object = strchr(gerattrs[i], '@'); @@ -907,6 +900,9 @@ _ger_generate_template_entry ( siz += strlen(attrs[i]) + 4 + 20; } } + /* get the target dn where the template entry is located */ + slapi_pblock_get( pb, SLAPI_TARGET_SDN, &sdn ); + dn = slapi_sdn_get_dn(sdn); if (dn) { /* dn: <attr>=<template_name>,<dn>\n\0 */ diff --git a/ldap/servers/plugins/acl/acllas.c b/ldap/servers/plugins/acl/acllas.c index e08c70c..4a82717 100644 --- a/ldap/servers/plugins/acl/acllas.c +++ b/ldap/servers/plugins/acl/acllas.c @@ -671,19 +671,17 @@ DS_LASUserDnEval(NSErr_t *errp, char *attr_name, CmpOp_t comparator, break; } if (rc == ACL_ERR) { - slapi_log_error( SLAPI_LOG_ACL, plugin_name, - "DS_LASUserDnEval:Error in matching patteren(%s)\n", - user); + slapi_log_error( SLAPI_LOG_ACL, plugin_name, + "DS_LASUserDnEval:Error in matching patteren(%s)\n", + user); } slapi_filter_free(f,1); } else { /* Must be a simple dn then */ - char *normed = NULL; - size_t dnlen = 0; - rc = slapi_dn_normalize_ext(user, 0, &normed, &dnlen); - if (rc == 0) { /* user passed in; not terminated */ - *(normed + dnlen) = '\0'; - } else if (rc < 0) { /* normalization failed, user the original */ + char *normed = slapi_create_dn_string("%s", user); + if (NULL == normed) { + slapi_log_error( SLAPI_LOG_FATAL, plugin_name, + "DS_LASUserDnEval:Error in normalizing dn(%s)\n", user); normed = user; } rc = slapi_utf8casecmp((ACLUCHP)lasinfo.clientDn, (ACLUCHP)normed); @@ -2375,7 +2373,7 @@ static int acllas__handle_group_entry (Slapi_Entry* e, void *callback_data) { struct eval_info *info; - Slapi_Attr *currAttr, *nextAttr; + Slapi_Attr *currAttr, *nextAttr; char *n_dn = NULL, *attrType; int n; int i; @@ -2383,7 +2381,7 @@ acllas__handle_group_entry (Slapi_Entry* e, void *callback_data) info = (struct eval_info *) callback_data; info->result = ACL_FALSE;
- if (e == NULL) { + if (e == NULL) { return 0; }
@@ -2397,14 +2395,14 @@ acllas__handle_group_entry (Slapi_Entry* e, void *callback_data) Slapi_Value *sval = NULL; const struct berval *attrVal;
- if ((strcasecmp (attrType, type_member) == 0) || - (strcasecmp (attrType, type_uniquemember) == 0 )) { + if ((strcasecmp (attrType, type_member) == 0) || + (strcasecmp (attrType, type_uniquemember) == 0 )) {
i = slapi_attr_first_value ( currAttr,&sval ); while ( i != -1 ) { struct member_info *groupMember = NULL; attrVal = slapi_value_get_berval ( sval ); - n_dn = slapi_create_dn_string( attrVal->bv_val ); + n_dn = slapi_create_dn_string( "%s", attrVal->bv_val ); if (NULL == n_dn) { slapi_log_error( SLAPI_LOG_FATAL, plugin_name, "acllas__handle_group_entry: Invalid syntax: %s\n", @@ -3496,7 +3494,6 @@ acllas__client_match_URL (struct acl_pblock *aclpb, char *n_clientdn, char *url Slapi_Filter *f = NULL; char *rawdn = NULL; char *dn = NULL; - size_t dnlen = 0; char *p = NULL; char *normed = NULL; /* ldap(s)://host:port/suffix?attrs?scope?filter */ @@ -3588,26 +3585,22 @@ acllas__client_match_URL (struct acl_pblock *aclpb, char *n_clientdn, char *url /* url has scope and/or filter: ldap(s):///suffix?attr?scope?filter */ *p = '\0'; /* null terminate the dn part of rawdn */ } - rc = slapi_dn_normalize_ext(rawdn, 0, &dn, &dnlen); - if (rc < 0) { + dn = slapi_create_dn_string("%s", rawdn); + if (NULL == dn) { slapi_log_error( SLAPI_LOG_FATAL, plugin_name, - "acllas__client_match_URL: error normalizing dn [%s] part of URL [%s]\n", rawdn, url); + "acllas__client_match_URL: error normalizing dn [%s] part of URL [%s]\n", + rawdn, url); goto done; - } else if (rc == 0) { /* url is passed in and not terminated with NULL*/ - *(dn + dnlen) = '\0'; } - /* else - rawdn normalized in place */ + normed = slapi_ch_smprintf("%s%s%s%s%s", - (prefix_len==LDAP_URL_prefix_len)? - LDAP_URL_prefix_core:LDAPS_URL_prefix_core, - hostport?hostport:"", dn, p?"?":"",p?p+1:""); + (prefix_len==LDAP_URL_prefix_len)? + LDAP_URL_prefix_core:LDAPS_URL_prefix_core, + hostport?hostport:"", dn, p?"?":"",p?p+1:""); if (p) { *p = Q; /* put the Q back in rawdn which will un-null terminate the DN part */ } - if (rc > 0) { - /* dn was allocated in slapi_dn_normalize_ext */ - slapi_ch_free_string(&dn); - } + slapi_ch_free_string(&dn); rc = slapi_ldap_url_parse(normed, &ludp, 1, NULL); if (rc) { slapi_log_error( SLAPI_LOG_FATAL, plugin_name, diff --git a/ldap/servers/plugins/acl/acllist.c b/ldap/servers/plugins/acl/acllist.c index b95baac..7e5221d 100644 --- a/ldap/servers/plugins/acl/acllist.c +++ b/ldap/servers/plugins/acl/acllist.c @@ -597,7 +597,7 @@ static void free_targetattrfilters( Targetattrfilter ***attrFilterArray) {
/* SEARCH */ void -acllist_init_scan (Slapi_PBlock *pb, int scope, char *base) +acllist_init_scan (Slapi_PBlock *pb, int scope, const char *base) { Acl_PBlock *aclpb; int i; @@ -625,7 +625,7 @@ acllist_init_scan (Slapi_PBlock *pb, int scope, char *base)
/* If base is NULL - it means we are going to go thru all the ACLs * This is needed when we do anonymous profile generation. - */ + */ if ( NULL == base ) { return; } @@ -638,22 +638,28 @@ acllist_init_scan (Slapi_PBlock *pb, int scope, char *base) index = 0; aclpb->aclpb_search_base = slapi_ch_strdup ( base );
- while (basedn ) { + while (basedn) { char *tmp = NULL; - slapi_sdn_set_ndn_byref ( aclpb->aclpb_aclContainer->acic_sdn, basedn ); + slapi_sdn_set_normdn_byref(aclpb->aclpb_aclContainer->acic_sdn, basedn);
- root = (AciContainer *) avl_find( acllistRoot, - (caddr_t) aclpb->aclpb_aclContainer, - (IFP) __acllist_aciContainer_node_cmp); + root = (AciContainer *) avl_find(acllistRoot, + (caddr_t) aclpb->aclpb_aclContainer, + (IFP) __acllist_aciContainer_node_cmp); if ( index >= ACLPB_MAX_SELECTED_ACLS -2 ) { aclpb->aclpb_handles_index[0] = -1; slapi_ch_free ( (void **) &basedn); break; - } else if ( NULL != root ) { + } else if ( NULL != root ) { aclpb->aclpb_base_handles_index[index++] = root->acic_index; aclpb->aclpb_base_handles_index[index] = -1; - } + } else if ( NULL == root ) { + /* slapi_dn_parent returns the "parent" dn syntactically. + * Most likely, basedn is above suffix (e.g., dn=com). + * Thus, no need to make it FATAL. */ + slapi_log_error ( SLAPI_LOG_ACL, plugin_name, + "Failed to find root for base: %s \n", basedn ); + } tmp = slapi_dn_parent ( basedn ); slapi_ch_free ( (void **) &basedn); basedn = tmp; @@ -679,11 +685,12 @@ acllist_init_scan (Slapi_PBlock *pb, int scope, char *base) * the given operation. */
+/* edn is normalized & case-ignored */ void acllist_aciscan_update_scan ( Acl_PBlock *aclpb, char *edn ) {
- int i, index = 0; + int index = 0; char *basedn = NULL; AciContainer *root; int is_not_search_base = 1; @@ -700,15 +707,13 @@ acllist_aciscan_update_scan ( Acl_PBlock *aclpb, char *edn ) * This stuff is only used if it's a search operation. */ if ( aclpb->aclpb_search_base ) { - while ( aclpb->aclpb_base_handles_index[index] != -1 && - index < ACLPB_MAX_SELECTED_ACLS -2 ) { - aclpb->aclpb_handles_index[index] = - aclpb->aclpb_base_handles_index[index]; - index++; - } if ( strcasecmp ( edn, aclpb->aclpb_search_base) == 0) { is_not_search_base = 0; } + for (index = 0; (aclpb->aclpb_base_handles_index[index] != -1) && + (index < ACLPB_MAX_SELECTED_ACLS - 2); index++) ; + memcpy(aclpb->aclpb_handles_index, aclpb->aclpb_base_handles_index, + sizeof(*aclpb->aclpb_handles_index) * index); } aclpb->aclpb_handles_index[index] = -1;
@@ -760,11 +765,6 @@ acllist_aciscan_update_scan ( Acl_PBlock *aclpb, char *edn ) }
acllist_done_aciContainer ( aclpb->aclpb_aclContainer ); - i = 0; - while ( i < ACLPB_MAX_SELECTED_ACLS && aclpb->aclpb_handles_index[i] != -1 ) { - i++; - } - }
aci_t * @@ -889,6 +889,7 @@ acllist_acicache_WRITE_LOCK( ) }
/* This routine must be called with the acicache write lock taken */ +/* newdn is normalized & case-ignored */ int acllist_moddn_aci_needsLock ( Slapi_DN *oldsdn, char *newdn ) { diff --git a/ldap/servers/plugins/acl/aclparse.c b/ldap/servers/plugins/acl/aclparse.c index a137db9..15b373b 100644 --- a/ldap/servers/plugins/acl/aclparse.c +++ b/ldap/servers/plugins/acl/aclparse.c @@ -533,8 +533,7 @@ __aclp__copy_normalized_str (char *src, char *endsrc, char *start, { char *p = NULL; int rc = -1; - char *dn = NULL; - size_t dnlen = 0; + const char *dn = NULL;
p = PL_strnstr(src, LDAP_URL_prefix, endsrc - src); if (p) { @@ -553,6 +552,8 @@ __aclp__copy_normalized_str (char *src, char *endsrc, char *start, rc = 0; if (p && strlen(p) > 0) { size_t len = 0; + Slapi_DN sdn; + char bak; /* strip the string starting from ? */ char *q = PL_strnchr(p, '?', endsrc - p); if (q) { @@ -560,18 +561,17 @@ __aclp__copy_normalized_str (char *src, char *endsrc, char *start, } else { len = endsrc - p; } + bak = *(p + len); + *(p + len) = '\0'; /* Normalize the value of userdn and append it to ret_str */ - rc = slapi_dn_normalize_ext(p, len, &dn, &dnlen); - if (rc < 0) { - return rc; - } + slapi_sdn_init_dn_byref(&sdn, p); + dn = slapi_sdn_get_dn(&sdn); /* append up to ldap(s):/// */ aclutil_str_append_ext(dest, destlen, start, p - start); /* append the DN part */ - aclutil_str_append_ext(dest, destlen, dn, dnlen); - if (rc > 0) { /* if rc == 0, p is passed in */ - slapi_ch_free_string(&dn); - } + aclutil_str_append_ext(dest, destlen, dn, strlen(dn)); + slapi_sdn_done(&sdn); + *(p + len) = bak; if (q) { /* append the rest from '?' */ aclutil_str_append_ext(dest, destlen, q, endsrc - q); diff --git a/ldap/servers/plugins/acl/aclplugin.c b/ldap/servers/plugins/acl/aclplugin.c index 66ef707..ecd1e11 100644 --- a/ldap/servers/plugins/acl/aclplugin.c +++ b/ldap/servers/plugins/acl/aclplugin.c @@ -135,7 +135,8 @@ static int aclplugin_preop_search ( Slapi_PBlock *pb ) { int scope; - char *base = NULL; + const char *base = NULL; + Slapi_DN *sdn = NULL; int optype; int isRoot; int rc = 0; @@ -151,7 +152,8 @@ aclplugin_preop_search ( Slapi_PBlock *pb ) return rc; }
- slapi_pblock_get( pb, SLAPI_SEARCH_TARGET, &base ); + slapi_pblock_get( pb, SLAPI_SEARCH_TARGET_SDN, &sdn ); + base = slapi_sdn_get_dn(sdn); /* For anonymous client doing search nothing needs to be set up */ if ( optype == SLAPI_OPERATION_SEARCH && aclanom_is_client_anonymous ( pb ) && ! slapi_dn_issuffix( base, "cn=monitor") ) { @@ -244,7 +246,7 @@ aclplugin_preop_common( Slapi_PBlock *pb ) slapi_log_error( SLAPI_LOG_ACL, plugin_name, "proxied authorization dn is (%s)\n", proxy_dn ); acl_init_aclpb ( pb, aclpb, proxy_dn, 1 ); - aclpb = acl_new_proxy_aclpb (pb ); + aclpb = acl_new_proxy_aclpb ( pb ); acl_init_aclpb ( pb, aclpb, dn, 0 ); slapi_ch_free ( (void **) &proxy_dn ); diff --git a/ldap/servers/plugins/automember/automember.c b/ldap/servers/plugins/automember/automember.c index 2e1d496..89ed1da 100644 --- a/ldap/servers/plugins/automember/automember.c +++ b/ldap/servers/plugins/automember/automember.c @@ -92,10 +92,10 @@ static void automember_free_config_entry(struct configEntry ** entry); /* * helpers */ -static char *automember_get_dn(Slapi_PBlock * pb); +static Slapi_DN *automember_get_sdn(Slapi_PBlock *pb); static Slapi_DN *automember_get_config_area(); static void automember_set_config_area(Slapi_DN *sdn); -static int automember_dn_is_config(char *dn); +static int automember_dn_is_config(Slapi_DN *sdn); static int automember_oktodo(Slapi_PBlock *pb); static int automember_isrepl(Slapi_PBlock *pb); static void automember_parse_regex_entry(struct configEntry *config, Slapi_Entry *e); @@ -275,7 +275,7 @@ automember_postop_init(Slapi_PBlock *pb) static int automember_start(Slapi_PBlock * pb) { - char *plugindn = NULL; + Slapi_DN *plugindn = NULL; char *config_area = NULL;
slapi_log_error(SLAPI_LOG_TRACE, AUTOMEMBER_PLUGIN_SUBSYSTEM, @@ -298,14 +298,14 @@ automember_start(Slapi_PBlock * pb) /* * Get the plug-in target dn from the system * and store it for future use. */ - slapi_pblock_get(pb, SLAPI_TARGET_DN, &plugindn); - if (NULL == plugindn || 0 == strlen(plugindn)) { + slapi_pblock_get(pb, SLAPI_TARGET_SDN, &plugindn); + if (NULL == plugindn || 0 == slapi_sdn_get_ndn_len(plugindn)) { slapi_log_error(SLAPI_LOG_PLUGIN, AUTOMEMBER_PLUGIN_SUBSYSTEM, "automember_start: unable to retrieve plugin dn\n"); return -1; }
- automember_set_plugin_sdn(slapi_sdn_new_dn_byref(plugindn)); + automember_set_plugin_sdn(slapi_sdn_dup(plugindn));
/* Set the alternate config area if one is defined. */ slapi_pblock_get(pb, SLAPI_PLUGIN_CONFIG_AREA, &config_area); @@ -804,28 +804,19 @@ automember_delete_config() return; }
- -/* - * Helper functions - */ -static char * -automember_get_dn(Slapi_PBlock * pb) +static Slapi_DN * +automember_get_sdn(Slapi_PBlock * pb) { - char *dn = 0; + Slapi_DN *sdn = 0; slapi_log_error(SLAPI_LOG_TRACE, AUTOMEMBER_PLUGIN_SUBSYSTEM, - "--> automember_get_dn\n"); + "--> automember_get_sdn\n");
- if (slapi_pblock_get(pb, SLAPI_TARGET_DN, &dn)) { - slapi_log_error(SLAPI_LOG_FATAL, AUTOMEMBER_PLUGIN_SUBSYSTEM, - "automember_get_dn: failed to get dn of changed entry"); - goto bail; - } + slapi_pblock_get(pb, SLAPI_TARGET_SDN, &sdn);
- bail: slapi_log_error(SLAPI_LOG_TRACE, AUTOMEMBER_PLUGIN_SUBSYSTEM, - "<-- automember_get_dn\n"); + "<-- automember_get_sdn\n");
- return dn; + return sdn; }
void @@ -846,20 +837,17 @@ automember_get_config_area() * Checks if dn is an auto membership config entry. */ static int -automember_dn_is_config(char *dn) +automember_dn_is_config(Slapi_DN *sdn) { int ret = 0; - Slapi_DN *sdn = NULL;
slapi_log_error(SLAPI_LOG_TRACE, AUTOMEMBER_PLUGIN_SUBSYSTEM, "--> automember_dn_is_config\n");
- if (dn == NULL) { + if (sdn == NULL) { goto bail; }
- sdn = slapi_sdn_new_dn_byref(dn); - /* If an alternate config area is configured, treat it's child * entries as config entries. If the alternate config area is * not configured, treat children of the top-level plug-in @@ -877,7 +865,6 @@ automember_dn_is_config(char *dn) }
bail: - slapi_sdn_free(&sdn); slapi_log_error(SLAPI_LOG_TRACE, AUTOMEMBER_PLUGIN_SUBSYSTEM, "<-- automember_dn_is_config\n");
@@ -1579,7 +1566,7 @@ automember_add_member_value(Slapi_Entry *member_e, const char *group_dn, static int automember_pre_op(Slapi_PBlock * pb, int modop) { - char *dn = 0; + Slapi_DN *sdn = 0; Slapi_Entry *e = 0; Slapi_Mods *smods = 0; LDAPMod **mods; @@ -1594,10 +1581,10 @@ automember_pre_op(Slapi_PBlock * pb, int modop) if (!g_plugin_started) goto bail;
- if (0 == (dn = automember_get_dn(pb))) + if (0 == (sdn = automember_get_sdn(pb))) goto bail;
- if (automember_dn_is_config(dn)) { + if (automember_dn_is_config(sdn)) { /* Validate config changes, but don't apply them. * This allows us to reject invalid config changes * here at the pre-op stage. Applying the config @@ -1609,10 +1596,8 @@ automember_pre_op(Slapi_PBlock * pb, int modop) } else if (LDAP_CHANGETYPE_MODIFY == modop) { /* Fetch the entry being modified so we can * create the resulting entry for validation. */ - Slapi_DN *tmp_dn = slapi_sdn_new_dn_byref(dn); - if (tmp_dn) { - slapi_search_internal_get_entry(tmp_dn, 0, &e, automember_get_plugin_id()); - slapi_sdn_free(&tmp_dn); + if (sdn) { + slapi_search_internal_get_entry(sdn, 0, &e, automember_get_plugin_id()); free_entry = 1; }
@@ -1692,7 +1677,7 @@ automember_mod_pre_op(Slapi_PBlock * pb) static int automember_mod_post_op(Slapi_PBlock *pb) { - char *dn = NULL; + Slapi_DN *sdn = NULL;
slapi_log_error(SLAPI_LOG_TRACE, AUTOMEMBER_PLUGIN_SUBSYSTEM, "--> automember_mod_post_op\n"); @@ -1702,9 +1687,9 @@ automember_mod_post_op(Slapi_PBlock *pb) goto bail; }
- if (automember_oktodo(pb) && (dn = automember_get_dn(pb))) { + if (automember_oktodo(pb) && (sdn = automember_get_sdn(pb))) { /* Check if the config is being modified and reload if so. */ - if (automember_dn_is_config(dn)) { + if (automember_dn_is_config(sdn)) { automember_load_config(); } } @@ -1720,7 +1705,7 @@ static int automember_add_post_op(Slapi_PBlock *pb) { Slapi_Entry *e = NULL; - char *dn = NULL; + Slapi_DN *sdn = NULL; struct configEntry *config = NULL; PRCList *list = NULL;
@@ -1732,14 +1717,15 @@ automember_add_post_op(Slapi_PBlock *pb) return 0;
/* Reload config if a config entry was added. */ - if ((dn = automember_get_dn(pb))) { - if (automember_dn_is_config(dn)) { + if ((sdn = automember_get_sdn(pb))) { + if (automember_dn_is_config(sdn)) { automember_load_config(); } } else { slapi_log_error(SLAPI_LOG_PLUGIN, AUTOMEMBER_PLUGIN_SUBSYSTEM, "automember_add_post_op: Error " "retrieving dn\n"); + goto bail; }
/* If replication, just bail. */ @@ -1777,7 +1763,7 @@ automember_add_post_op(Slapi_PBlock *pb) config = (struct configEntry *)list;
/* Does the entry meet scope and filter requirements? */ - if (slapi_dn_issuffix(dn, config->scope) && + if (slapi_dn_issuffix(slapi_sdn_get_dn(sdn), config->scope) && (slapi_filter_test_simple(e, config->filter) == 0)) { /* Find out what membership changes are needed and make them. */ automember_update_membership(config, e); @@ -1791,9 +1777,9 @@ automember_add_post_op(Slapi_PBlock *pb) } else { slapi_log_error(SLAPI_LOG_PLUGIN, AUTOMEMBER_PLUGIN_SUBSYSTEM, "automember_add_post_op: Error " - "retrieving post-op entry %s\n", dn); + "retrieving post-op entry %s\n", slapi_sdn_get_dn(sdn)); } - +bail: slapi_log_error(SLAPI_LOG_TRACE, AUTOMEMBER_PLUGIN_SUBSYSTEM, "<-- automember_add_post_op\n");
@@ -1808,7 +1794,7 @@ automember_add_post_op(Slapi_PBlock *pb) static int automember_del_post_op(Slapi_PBlock *pb) { - char *dn = NULL; + Slapi_DN *sdn = NULL;
slapi_log_error(SLAPI_LOG_TRACE, AUTOMEMBER_PLUGIN_SUBSYSTEM, "--> automember_del_post_op\n"); @@ -1819,8 +1805,8 @@ automember_del_post_op(Slapi_PBlock *pb) }
/* Reload config if a config entry was deleted. */ - if ((dn = automember_get_dn(pb))) { - if (automember_dn_is_config(dn)) + if ((sdn = automember_get_sdn(pb))) { + if (automember_dn_is_config(sdn)) automember_load_config(); } else { slapi_log_error(SLAPI_LOG_PLUGIN, AUTOMEMBER_PLUGIN_SUBSYSTEM, @@ -1843,8 +1829,8 @@ automember_del_post_op(Slapi_PBlock *pb) static int automember_modrdn_post_op(Slapi_PBlock *pb) { - char *old_dn = NULL; - char *new_dn = NULL; + Slapi_DN *old_sdn = NULL; + Slapi_DN *new_sdn = NULL; Slapi_Entry *post_e = NULL;
slapi_log_error(SLAPI_LOG_TRACE, AUTOMEMBER_PLUGIN_SUBSYSTEM, @@ -1859,7 +1845,7 @@ automember_modrdn_post_op(Slapi_PBlock *pb) * config entries. */ slapi_pblock_get(pb, SLAPI_ENTRY_POST_OP, &post_e); if (post_e) { - new_dn = slapi_entry_get_ndn(post_e); + new_sdn = slapi_entry_get_sdn(post_e); } else { slapi_log_error(SLAPI_LOG_PLUGIN, AUTOMEMBER_PLUGIN_SUBSYSTEM, "automember_modrdn_post_op: Error " @@ -1867,8 +1853,8 @@ automember_modrdn_post_op(Slapi_PBlock *pb) return 0; }
- if ((old_dn = automember_get_dn(pb))) { - if (automember_dn_is_config(old_dn) || automember_dn_is_config(new_dn)) + if ((old_sdn = automember_get_sdn(pb))) { + if (automember_dn_is_config(old_sdn) || automember_dn_is_config(new_sdn)) automember_load_config(); } else { slapi_log_error(SLAPI_LOG_PLUGIN, AUTOMEMBER_PLUGIN_SUBSYSTEM, diff --git a/ldap/servers/plugins/chainingdb/cb_add.c b/ldap/servers/plugins/chainingdb/cb_add.c index 501865a..116ac92 100644 --- a/ldap/servers/plugins/chainingdb/cb_add.c +++ b/ldap/servers/plugins/chainingdb/cb_add.c @@ -65,41 +65,44 @@ chaining_back_add ( Slapi_PBlock *pb ) char **referrals=NULL; LDAPMod ** mods; LDAPMessage * res; - char *dn,* matched_msg, *error_msg; + char * matched_msg, *error_msg; + const char *dn = NULL; + Slapi_DN *sdn = NULL; char *cnxerrbuf=NULL; - time_t endtime; + time_t endtime; cb_outgoing_conn *cnx; if ( (rc=cb_forward_operation(pb)) != LDAP_SUCCESS ) { - cb_send_ldap_result( pb, rc, NULL, "Remote data access disabled", 0, NULL ); + cb_send_ldap_result( pb, rc, NULL, "Remote data access disabled", 0, NULL ); return -1; }
- slapi_pblock_get( pb, SLAPI_BACKEND, &be ); + slapi_pblock_get( pb, SLAPI_BACKEND, &be ); cb = cb_get_instance(be);
/* Update monitor info */ cb_update_monitor_info(pb,cb,SLAPI_OPERATION_ADD);
/* Check wether the chaining BE is available or not */ - if ( cb_check_availability( cb, pb ) == FARMSERVER_UNAVAILABLE ){ + if ( cb_check_availability( cb, pb ) == FARMSERVER_UNAVAILABLE ){ return -1; - } + }
+ slapi_pblock_get( pb, SLAPI_ADD_TARGET_SDN, &sdn ); + slapi_pblock_get( pb, SLAPI_ADD_ENTRY, &e );
- slapi_pblock_get( pb, SLAPI_ADD_TARGET, &dn ); - slapi_pblock_get( pb, SLAPI_ADD_ENTRY, &e ); + dn = slapi_sdn_get_dn(sdn);
/* Check local access controls */ if (cb->local_acl && !cb->associated_be_is_disabled) { char * errbuf=NULL; - rc = cb_access_allowed (pb, e, NULL, NULL, SLAPI_ACL_ADD, &errbuf); - if ( rc != LDAP_SUCCESS ) { - cb_send_ldap_result( pb, rc, NULL, errbuf, 0, NULL ); - slapi_ch_free((void **)&errbuf); + rc = cb_access_allowed (pb, e, NULL, NULL, SLAPI_ACL_ADD, &errbuf); + if ( rc != LDAP_SUCCESS ) { + cb_send_ldap_result( pb, rc, NULL, errbuf, 0, NULL ); + slapi_ch_free((void **)&errbuf); return -1; } - } + }
/* Build LDAPMod from the SLapi_Entry */ cb_eliminate_illegal_attributes(cb,e); diff --git a/ldap/servers/plugins/chainingdb/cb_bind.c b/ldap/servers/plugins/chainingdb/cb_bind.c index 0d46b7a..edc45f3 100644 --- a/ldap/servers/plugins/chainingdb/cb_bind.c +++ b/ldap/servers/plugins/chainingdb/cb_bind.c @@ -47,10 +47,11 @@ cb_free_bervals( struct berval **bvs );
static int -cb_sasl_bind_once_s( cb_conn_pool *pool, char *dn, int method, char * mechanism, - struct berval *creds, LDAPControl **reqctrls, - char **matcheddnp, char **errmsgp, struct berval ***refurlsp, - LDAPControl ***resctrlsp , int * status); +cb_sasl_bind_once_s( cb_conn_pool *pool, const char *dn, int method, + char * mechanism, struct berval *creds, + LDAPControl **reqctrls, char **matcheddnp, + char **errmsgp, struct berval ***refurlsp, + LDAPControl ***resctrlsp , int * status);
/* * Attempt to chain a bind request off to "srvr." We return an LDAP error @@ -67,17 +68,18 @@ cb_sasl_bind_once_s( cb_conn_pool *pool, char *dn, int method, char * mechanism,
static int cb_sasl_bind_s(Slapi_PBlock * pb, cb_conn_pool *pool, int tries, - char *dn, int method,char * mechanism, struct berval *creds, LDAPControl **reqctrls, - char **matcheddnp, char **errmsgp, struct berval ***refurlsp, - LDAPControl ***resctrlsp ,int *status) { - + const char *dn, int method,char * mechanism, + struct berval *creds, LDAPControl **reqctrls, + char **matcheddnp, char **errmsgp, struct berval ***refurlsp, + LDAPControl ***resctrlsp ,int *status) +{ int rc;
do { /* check to see if operation has been abandoned...*/
- if (LDAP_AUTH_SIMPLE!=method) - return LDAP_AUTH_METHOD_NOT_SUPPORTED; + if (LDAP_AUTH_SIMPLE!=method) + return LDAP_AUTH_METHOD_NOT_SUPPORTED;
if ( slapi_op_abandoned( pb )) { rc = LDAP_USER_CANCELLED; @@ -91,10 +93,11 @@ cb_sasl_bind_s(Slapi_PBlock * pb, cb_conn_pool *pool, int tries, }
static int -cb_sasl_bind_once_s( cb_conn_pool *pool, char *dn, int method, char * mechanism, - struct berval *creds, LDAPControl **reqctrls, - char **matcheddnp, char **errmsgp, struct berval ***refurlsp, - LDAPControl ***resctrlsp , int * status ) +cb_sasl_bind_once_s( cb_conn_pool *pool, const char *dn, int method, + char * mechanism, struct berval *creds, + LDAPControl **reqctrls, char **matcheddnp, + char **errmsgp, struct berval ***refurlsp, + LDAPControl ***resctrlsp , int * status ) { int rc, msgid; char **referrals; @@ -225,18 +228,20 @@ release_and_return: }
int -chainingdb_bind( Slapi_PBlock *pb ) { +chainingdb_bind( Slapi_PBlock *pb ) +{
int status=LDAP_SUCCESS; int allocated_errmsg; int rc=LDAP_SUCCESS; cb_backend_instance *cb; Slapi_Backend *be; - char *dn; - int method; - struct berval *creds, **urls; + const char *dn = NULL; + Slapi_DN *sdn = NULL; + int method; + struct berval *creds, **urls; char *matcheddn,*errmsg; - LDAPControl **reqctrls, **resctrls, **ctrls; + LDAPControl **reqctrls, **resctrls, **ctrls; char * mechanism; int freectrls=1; int bind_retry; @@ -258,16 +263,18 @@ chainingdb_bind( Slapi_PBlock *pb ) { if (ctrls) ldap_controls_free(ctrls);
- slapi_pblock_get( pb, SLAPI_BACKEND, &be ); - slapi_pblock_get( pb, SLAPI_BIND_TARGET, &dn ); - slapi_pblock_get( pb, SLAPI_BIND_METHOD, &method ); + slapi_pblock_get( pb, SLAPI_BACKEND, &be ); + slapi_pblock_get( pb, SLAPI_BIND_TARGET_SDN, &sdn ); + slapi_pblock_get( pb, SLAPI_BIND_METHOD, &method ); slapi_pblock_get( pb, SLAPI_BIND_SASLMECHANISM, &mechanism); - slapi_pblock_get( pb, SLAPI_BIND_CREDENTIALS, &creds ); - slapi_pblock_get( pb, SLAPI_REQCONTROLS, &reqctrls ); - cb = cb_get_instance(be); + slapi_pblock_get( pb, SLAPI_BIND_CREDENTIALS, &creds ); + slapi_pblock_get( pb, SLAPI_REQCONTROLS, &reqctrls ); + cb = cb_get_instance(be);
- if ( NULL == dn ) - dn=""; + if ( NULL == sdn ) { + sdn = slapi_sdn_new_ndn_byval(""); + } + dn = slapi_sdn_get_ndn(sdn);
/* always allow noauth simple binds */ if (( method == LDAP_AUTH_SIMPLE) && creds->bv_len == 0 ) { diff --git a/ldap/servers/plugins/chainingdb/cb_compare.c b/ldap/servers/plugins/chainingdb/cb_compare.c index ccbc175..16f6c7b 100644 --- a/ldap/servers/plugins/chainingdb/cb_compare.c +++ b/ldap/servers/plugins/chainingdb/cb_compare.c @@ -63,29 +63,33 @@ chaining_back_compare ( Slapi_PBlock *pb ) LDAP *ld=NULL; char **referrals=NULL; LDAPMessage * res; - char *type,*dn,* matched_msg, *error_msg; + char *type, *matched_msg, *error_msg; + const char *dn = NULL; + Slapi_DN *sdn = NULL; char *cnxerrbuf=NULL; - time_t endtime; + time_t endtime; cb_outgoing_conn *cnx;
- if ( LDAP_SUCCESS != (rc=cb_forward_operation(pb) )) { - cb_send_ldap_result( pb, rc, NULL, "Chaining forbidden", 0, NULL ); - return -1; - } + if ( LDAP_SUCCESS != (rc=cb_forward_operation(pb) )) { + cb_send_ldap_result( pb, rc, NULL, "Chaining forbidden", 0, NULL ); + return -1; + }
- slapi_pblock_get( pb, SLAPI_BACKEND, &be ); + slapi_pblock_get( pb, SLAPI_BACKEND, &be ); cb = cb_get_instance(be);
- cb_update_monitor_info(pb,cb,SLAPI_OPERATION_COMPARE); + cb_update_monitor_info(pb,cb,SLAPI_OPERATION_COMPARE);
/* Check wether the chaining BE is available or not */ - if ( cb_check_availability( cb, pb ) == FARMSERVER_UNAVAILABLE ){ - return -1; - } + if ( cb_check_availability( cb, pb ) == FARMSERVER_UNAVAILABLE ){ + return -1; + } + + slapi_pblock_get( pb, SLAPI_COMPARE_TARGET_SDN, &sdn ); + slapi_pblock_get( pb, SLAPI_COMPARE_TYPE, &type ); + slapi_pblock_get( pb, SLAPI_COMPARE_VALUE, &bval );
- slapi_pblock_get( pb, SLAPI_COMPARE_TARGET, &dn ); - slapi_pblock_get( pb, SLAPI_COMPARE_TYPE, &type ); - slapi_pblock_get( pb, SLAPI_COMPARE_VALUE, &bval ); + dn = slapi_sdn_get_dn(sdn);
/* * Check local acls @@ -96,17 +100,17 @@ chaining_back_compare ( Slapi_PBlock *pb )
if (checkacl) { char * errbuf=NULL; - Slapi_Entry *te = slapi_entry_alloc(); - slapi_entry_set_dn(te,slapi_ch_strdup(dn)); - rc = cb_access_allowed (pb, te, type, bval, SLAPI_ACL_COMPARE,&errbuf); - slapi_entry_free(te); + Slapi_Entry *te = slapi_entry_alloc(); + slapi_entry_set_sdn(te, sdn); /* sdn: copied */ + rc = cb_access_allowed (pb, te, type, bval, SLAPI_ACL_COMPARE,&errbuf); + slapi_entry_free(te);
- if ( rc != LDAP_SUCCESS ) { - cb_send_ldap_result( pb, rc, NULL, errbuf, 0, NULL ); + if ( rc != LDAP_SUCCESS ) { + cb_send_ldap_result( pb, rc, NULL, errbuf, 0, NULL ); slapi_ch_free((void **) &errbuf); return 1; } - } + }
/* * Grab a connection handle diff --git a/ldap/servers/plugins/chainingdb/cb_controls.c b/ldap/servers/plugins/chainingdb/cb_controls.c index da2d283..f079901 100644 --- a/ldap/servers/plugins/chainingdb/cb_controls.c +++ b/ldap/servers/plugins/chainingdb/cb_controls.c @@ -201,9 +201,9 @@ int cb_update_controls( Slapi_PBlock * pb, char * requestorCopy=NULL;
rootdn=cb_get_rootdn(); - slapi_pblock_get( pb, SLAPI_REQUESTOR_DN, &requestor ); - requestorCopy=slapi_ch_strdup(requestor); - slapi_dn_normalize_case(requestorCopy); + slapi_pblock_get( pb, SLAPI_REQUESTOR_NDN, &requestor ); + requestorCopy = slapi_ch_strdup(requestor); + slapi_dn_ignore_case(requestorCopy);
if (!strcmp( requestorCopy, rootdn )) { /* UTF8- aware */ slapi_log_error( SLAPI_LOG_PLUGIN,CB_PLUGIN_SUBSYSTEM, diff --git a/ldap/servers/plugins/chainingdb/cb_delete.c b/ldap/servers/plugins/chainingdb/cb_delete.c index 992f606..87a69a2 100644 --- a/ldap/servers/plugins/chainingdb/cb_delete.c +++ b/ldap/servers/plugins/chainingdb/cb_delete.c @@ -62,27 +62,30 @@ chaining_back_delete ( Slapi_PBlock *pb ) LDAP *ld=NULL; char **referrals=NULL; LDAPMessage * res; - char *dn,* matched_msg, *error_msg; + const char *dn = NULL; + Slapi_DN *sdn = NULL; + char *matched_msg, *error_msg; char *cnxerrbuf=NULL; - time_t endtime; + time_t endtime; cb_outgoing_conn *cnx;
- if ( LDAP_SUCCESS != (rc=cb_forward_operation(pb) )) { - cb_send_ldap_result( pb, rc, NULL, "Chaining forbidden", 0, NULL ); - return -1; - } + if ( LDAP_SUCCESS != (rc=cb_forward_operation(pb) )) { + cb_send_ldap_result( pb, rc, NULL, "Chaining forbidden", 0, NULL ); + return -1; + }
- slapi_pblock_get( pb, SLAPI_BACKEND, &be ); + slapi_pblock_get( pb, SLAPI_BACKEND, &be ); cb = cb_get_instance(be);
- cb_update_monitor_info(pb,cb,SLAPI_OPERATION_DELETE); + cb_update_monitor_info(pb,cb,SLAPI_OPERATION_DELETE);
/* Check wether the chaining BE is available or not */ - if ( cb_check_availability( cb, pb ) == FARMSERVER_UNAVAILABLE ){ - return -1; - } + if ( cb_check_availability( cb, pb ) == FARMSERVER_UNAVAILABLE ){ + return -1; + }
- slapi_pblock_get( pb, SLAPI_DELETE_TARGET, &dn ); + slapi_pblock_get( pb, SLAPI_DELETE_TARGET_SDN, &sdn ); + dn = slapi_sdn_get_dn(sdn);
/* * Check local acls @@ -90,17 +93,17 @@ chaining_back_delete ( Slapi_PBlock *pb )
if (cb->local_acl && !cb->associated_be_is_disabled) { char * errbuf=NULL; - Slapi_Entry *te = slapi_entry_alloc(); - slapi_entry_set_dn(te,slapi_ch_strdup(dn)); - rc = cb_access_allowed (pb, te, NULL, NULL, SLAPI_ACL_DELETE,&errbuf); - slapi_entry_free(te); + Slapi_Entry *te = slapi_entry_alloc(); + slapi_entry_set_sdn(te, sdn); /* sdn: copied */ + rc = cb_access_allowed (pb, te, NULL, NULL, SLAPI_ACL_DELETE,&errbuf); + slapi_entry_free(te);
- if ( rc != LDAP_SUCCESS ) { - cb_send_ldap_result( pb, rc, NULL, errbuf, 0, NULL ); - slapi_ch_free((void **)&errbuf); + if ( rc != LDAP_SUCCESS ) { + cb_send_ldap_result( pb, rc, NULL, errbuf, 0, NULL ); + slapi_ch_free((void **)&errbuf); return -1; } - } + }
/* * Grab a connection handle diff --git a/ldap/servers/plugins/chainingdb/cb_instance.c b/ldap/servers/plugins/chainingdb/cb_instance.c index 145d5a3..9a33916 100644 --- a/ldap/servers/plugins/chainingdb/cb_instance.c +++ b/ldap/servers/plugins/chainingdb/cb_instance.c @@ -850,9 +850,9 @@ static int cb_instance_binduser_set(void *arg, void *value, char *errorbuf, int
if (apply) {
- slapi_rwlock_wrlock(inst->rwl_config_lock); + slapi_rwlock_wrlock(inst->rwl_config_lock); if (( phase != CB_CONFIG_PHASE_INITIALIZATION ) && - ( phase != CB_CONFIG_PHASE_STARTUP )) { + ( phase != CB_CONFIG_PHASE_STARTUP )) {
/* Dynamic modif */ /* Free user later */ @@ -862,10 +862,11 @@ static int cb_instance_binduser_set(void *arg, void *value, char *errorbuf, int rc=CB_REOPEN_CONN; }
- inst->pool->binddn=slapi_ch_strdup((char *) value); + /* normalize and ignore the case */ + inst->pool->binddn = slapi_create_dn_string_case("%s", (char *)value); + /* not normalized */ inst->pool->binddn2=slapi_ch_strdup((char *) value); - slapi_dn_normalize_case(inst->pool->binddn); - slapi_rwlock_unlock(inst->rwl_config_lock); + slapi_rwlock_unlock(inst->rwl_config_lock); } else {
/* Security check */ @@ -877,19 +878,18 @@ static int cb_instance_binduser_set(void *arg, void *value, char *errorbuf, int char * theValueCopy = NULL;
if (value) { - theValueCopy=slapi_ch_strdup((char *) value); - slapi_dn_normalize_case(theValueCopy); + theValueCopy = slapi_create_dn_string_case("%s", (char *) value); }
slapi_rwlock_rdlock(inst->rwl_config_lock); - if (inst->impersonate && theValueCopy && - !strcmp(theValueCopy,rootdn)) { /* UTF8-aware. See cb_get_dn() */ - rc=LDAP_UNWILLING_TO_PERFORM; + if (inst->impersonate && theValueCopy && + !strcmp(theValueCopy,rootdn)) { /* UTF8-aware. See cb_get_dn() */ + rc=LDAP_UNWILLING_TO_PERFORM; if (errorbuf) { PR_snprintf(errorbuf,SLAPI_DSE_RETURNTEXT_SIZE, "value %s not allowed",rootdn); } - } - slapi_rwlock_unlock(inst->rwl_config_lock); + } + slapi_rwlock_unlock(inst->rwl_config_lock);
slapi_ch_free((void **)&theValueCopy); slapi_ch_free((void **)&rootdn); diff --git a/ldap/servers/plugins/chainingdb/cb_modify.c b/ldap/servers/plugins/chainingdb/cb_modify.c index fcfb310..aa914b9 100644 --- a/ldap/servers/plugins/chainingdb/cb_modify.c +++ b/ldap/servers/plugins/chainingdb/cb_modify.c @@ -65,51 +65,54 @@ chaining_back_modify ( Slapi_PBlock *pb ) char **referrals=NULL; LDAPMod ** mods; LDAPMessage * res; - char *dn,* matched_msg, *error_msg; + const char *dn = NULL; + Slapi_DN *sdn = NULL; + char *matched_msg, *error_msg; char *cnxerrbuf=NULL; - time_t endtime; + time_t endtime; cb_outgoing_conn *cnx;
- if ( LDAP_SUCCESS != (rc=cb_forward_operation(pb) )) { - cb_send_ldap_result( pb, rc, NULL, "Chaining forbidden", 0, NULL ); - return -1; - } + if ( LDAP_SUCCESS != (rc=cb_forward_operation(pb) )) { + cb_send_ldap_result( pb, rc, NULL, "Chaining forbidden", 0, NULL ); + return -1; + }
- slapi_pblock_get( pb, SLAPI_BACKEND, &be ); + slapi_pblock_get( pb, SLAPI_BACKEND, &be ); cb = cb_get_instance(be);
- cb_update_monitor_info(pb,cb,SLAPI_OPERATION_MODIFY); + cb_update_monitor_info(pb,cb,SLAPI_OPERATION_MODIFY);
/* Check wether the chaining BE is available or not */ - if ( cb_check_availability( cb, pb ) == FARMSERVER_UNAVAILABLE ){ - return -1; - } + if ( cb_check_availability( cb, pb ) == FARMSERVER_UNAVAILABLE ){ + return -1; + }
- slapi_pblock_get( pb, SLAPI_MODIFY_TARGET, &dn ); + slapi_pblock_get( pb, SLAPI_MODIFY_TARGET_SDN, &sdn ); + dn = slapi_sdn_get_dn(sdn);
if (cb_debug_on()) { - slapi_log_error( SLAPI_LOG_PLUGIN, CB_PLUGIN_SUBSYSTEM,"modify: target:<%s>\n",dn); + slapi_log_error( SLAPI_LOG_PLUGIN, CB_PLUGIN_SUBSYSTEM,"modify: target:<%s>\n",dn); }
ctrls=serverctrls=NULL; - slapi_pblock_get( pb, SLAPI_MODIFY_MODS, &mods ); - slapi_pblock_get( pb, SLAPI_REQCONTROLS, &ctrls ); + slapi_pblock_get( pb, SLAPI_MODIFY_MODS, &mods ); + slapi_pblock_get( pb, SLAPI_REQCONTROLS, &ctrls );
/* Check acls */ if ( cb->local_acl && !cb->associated_be_is_disabled ) { - char * errbuf=NULL; - Slapi_Entry *te = slapi_entry_alloc(); - slapi_entry_set_dn(te,slapi_ch_strdup(dn)); - rc = slapi_acl_check_mods( pb, te, mods, &errbuf); - slapi_entry_free(te); - - if ( rc != LDAP_SUCCESS ) { - cb_send_ldap_result( pb, rc, NULL, errbuf, 0, NULL ); - slapi_ch_free((void **)&errbuf); - return -1; - } + char * errbuf=NULL; + Slapi_Entry *te = slapi_entry_alloc(); + slapi_entry_set_sdn(te, sdn); /* sdn: copied */ + rc = slapi_acl_check_mods( pb, te, mods, &errbuf); + slapi_entry_free(te); + + if ( rc != LDAP_SUCCESS ) { + cb_send_ldap_result( pb, rc, NULL, errbuf, 0, NULL ); + slapi_ch_free((void **)&errbuf); + return -1; + } }
diff --git a/ldap/servers/plugins/chainingdb/cb_modrdn.c b/ldap/servers/plugins/chainingdb/cb_modrdn.c index 2efff02..b6b882b 100644 --- a/ldap/servers/plugins/chainingdb/cb_modrdn.c +++ b/ldap/servers/plugins/chainingdb/cb_modrdn.c @@ -54,20 +54,25 @@ int chaining_back_modrdn ( Slapi_PBlock *pb ) { - - Slapi_Backend * be; - cb_backend_instance *cb; - LDAPControl **ctrls, **serverctrls; - int rc,parse_rc,msgid,i; - LDAP *ld=NULL; - char **referrals=NULL; - LDAPMessage * res; - char * matched_msg, *error_msg,* pdn, *newdn, *dn; - int deleteoldrdn=0; - char * newsuperior, *newrdn; - char * cnxerrbuf=NULL; - time_t endtime; - cb_outgoing_conn * cnx; + Slapi_Backend * be; + cb_backend_instance *cb; + LDAPControl **ctrls, **serverctrls; + int rc,parse_rc,msgid,i; + LDAP *ld=NULL; + char **referrals=NULL; + LDAPMessage *res; + char *matched_msg, *error_msg; + char *newdn = NULL; + const char *pdn = NULL; + char *ndn = NULL; + Slapi_DN *sdn = NULL; + Slapi_DN *psdn = NULL; + int deleteoldrdn = 0; + Slapi_DN *newsuperior = NULL; + char *newrdn = NULL; + char * cnxerrbuf=NULL; + time_t endtime; + cb_outgoing_conn *cnx;
if ( LDAP_SUCCESS != (rc=cb_forward_operation(pb) )) { cb_send_ldap_result( pb, rc, NULL, "Chaining forbidden", 0, NULL ); @@ -75,38 +80,36 @@ chaining_back_modrdn ( Slapi_PBlock *pb ) }
slapi_pblock_get( pb, SLAPI_BACKEND, &be ); - cb = cb_get_instance(be); + cb = cb_get_instance(be);
cb_update_monitor_info(pb,cb,SLAPI_OPERATION_MODRDN);
- /* Check wether the chaining BE is available or not */ + /* Check wether the chaining BE is available or not */ if ( cb_check_availability( cb, pb ) == FARMSERVER_UNAVAILABLE ){ return -1; }
- newsuperior=newdn=newrdn=dn=NULL; - slapi_pblock_get( pb, SLAPI_MODRDN_TARGET, &dn ); + slapi_pblock_get( pb, SLAPI_MODRDN_TARGET_SDN, &sdn ); slapi_pblock_get( pb, SLAPI_MODRDN_NEWRDN, &newrdn ); - slapi_pblock_get( pb, SLAPI_MODRDN_NEWSUPERIOR, &newsuperior ); + slapi_pblock_get( pb, SLAPI_MODRDN_NEWSUPERIOR_SDN, &newsuperior ); slapi_pblock_get( pb, SLAPI_MODRDN_DELOLDRDN, &deleteoldrdn );
- /* - * Construct the new dn - */ + ndn = (char *)slapi_sdn_get_ndn(sdn);
- dn = slapi_dn_normalize_case(dn); - if ( (pdn = slapi_dn_parent( dn )) != NULL ) { - /* parent + rdn + separator(s) + null */ - newdn = (char *) slapi_ch_malloc( strlen( pdn ) + strlen( newrdn ) + 3 ); - strcpy( newdn, newrdn ); - strcat( newdn, "," ); - strcat( newdn, pdn ); - - slapi_ch_free((void **)&pdn ); + /* + * Construct the new dn + */ + psdn = slapi_sdn_new(); + slapi_sdn_get_parent(sdn, psdn); + pdn = slapi_sdn_get_ndn(psdn);
+ if ( pdn ) { + /* parent + rdn + separator(s) + null */ + newdn = slapi_ch_smprintf("%s,%s", newrdn, pdn); } else { - newdn = slapi_ch_strdup( newrdn ); + newdn = slapi_ch_strdup( newrdn ); } + slapi_sdn_free(&psdn);
/* * Make sure the current backend is managing @@ -119,19 +122,19 @@ chaining_back_modrdn ( Slapi_PBlock *pb )
if (cb->local_acl && !cb->associated_be_is_disabled) { /* - * Check local acls - * Keep in mind We don't have the entry for acl evaluation - */ + * Check local acls + * Keep in mind We don't have the entry for acl evaluation + */
char * errbuf=NULL; - Slapi_Entry *te = slapi_entry_alloc(); - slapi_entry_set_dn(te,slapi_ch_strdup(dn)); - rc = cb_access_allowed (pb, te, NULL, NULL, SLAPI_ACL_WRITE,&errbuf); - slapi_entry_free(te); - - if ( rc != LDAP_SUCCESS ) { - cb_send_ldap_result( pb, rc, NULL, errbuf, 0, NULL ); - slapi_ch_free((void **)&errbuf); + Slapi_Entry *te = slapi_entry_alloc(); + slapi_entry_set_sdn(te, sdn); /* sdn: copied */ + rc = cb_access_allowed (pb, te, NULL, NULL, SLAPI_ACL_WRITE,&errbuf); + slapi_entry_free(te); + + if ( rc != LDAP_SUCCESS ) { + cb_send_ldap_result( pb, rc, NULL, errbuf, 0, NULL ); + slapi_ch_free((void **)&errbuf); return -1; } } @@ -183,7 +186,8 @@ chaining_back_modrdn ( Slapi_PBlock *pb ) * Send LDAP operation to the remote host */
- rc = ldap_rename ( ld,dn,newrdn,newsuperior,deleteoldrdn,ctrls,NULL,&msgid); + rc = ldap_rename ( ld, ndn, newrdn, slapi_sdn_get_dn(newsuperior), + deleteoldrdn, ctrls, NULL, &msgid );
if ( NULL != ctrls) ldap_controls_free(ctrls); diff --git a/ldap/servers/plugins/chainingdb/cb_search.c b/ldap/servers/plugins/chainingdb/cb_search.c index a16ed4c..92eb2ea 100644 --- a/ldap/servers/plugins/chainingdb/cb_search.c +++ b/ldap/servers/plugins/chainingdb/cb_search.c @@ -58,41 +58,45 @@ chainingdb_build_candidate_list ( Slapi_PBlock *pb )
Slapi_Backend * be; Slapi_Operation * op; - char *target, *filter; + char *filter; + const char *target = NULL; + Slapi_DN *target_sdn = NULL; int scope,attrsonly,sizelimit,timelimit,rc,searchreferral; char **attrs=NULL; LDAPControl **controls=NULL; LDAPControl **ctrls=NULL; - LDAP *ld=NULL; - cb_backend_instance *cb = NULL; + LDAP *ld=NULL; + cb_backend_instance *cb = NULL; cb_searchContext *ctx=NULL; struct timeval timeout; time_t optime; int doit,parse_rc; - LDAPMessage *res=NULL; - char *matched_msg,*error_msg; - LDAPControl **serverctrls=NULL; - char **referrals=NULL; + LDAPMessage *res=NULL; + char *matched_msg,*error_msg; + LDAPControl **serverctrls=NULL; + char **referrals=NULL; char *cnxerrbuf=NULL; time_t endbefore=0; time_t endtime; cb_outgoing_conn *cnx;
- slapi_pblock_get( pb, SLAPI_BACKEND, &be ); + slapi_pblock_get( pb, SLAPI_BACKEND, &be ); cb = cb_get_instance(be);
- slapi_pblock_get( pb, SLAPI_OPERATION, &op ); - slapi_pblock_get( pb, SLAPI_SEARCH_STRFILTER, &filter ); - slapi_pblock_get( pb, SLAPI_SEARCH_SCOPE, &scope ); - slapi_pblock_get( pb, SLAPI_OPINITIATED_TIME, &optime ); - slapi_pblock_get( pb, SLAPI_SEARCH_TARGET, &target ); + slapi_pblock_get( pb, SLAPI_OPERATION, &op ); + slapi_pblock_get( pb, SLAPI_SEARCH_STRFILTER, &filter ); + slapi_pblock_get( pb, SLAPI_SEARCH_SCOPE, &scope ); + slapi_pblock_get( pb, SLAPI_OPINITIATED_TIME, &optime ); + slapi_pblock_get( pb, SLAPI_SEARCH_TARGET_SDN, &target_sdn );
- if ( LDAP_SUCCESS != (parse_rc=cb_forward_operation(pb) )) { + target = slapi_sdn_get_dn(target_sdn); + + if ( LDAP_SUCCESS != (parse_rc=cb_forward_operation(pb) )) {
/* Don't return errors */
if (cb_debug_on()) { - slapi_log_error( SLAPI_LOG_PLUGIN, CB_PLUGIN_SUBSYSTEM, + slapi_log_error( SLAPI_LOG_PLUGIN, CB_PLUGIN_SUBSYSTEM, "local search: base:<%s> scope:<%s> filter:<%s>\n",target, scope==LDAP_SCOPE_SUBTREE?"SUBTREE":scope==LDAP_SCOPE_ONELEVEL ? "ONE-LEVEL" : "BASE" , filter); } @@ -135,28 +139,28 @@ chainingdb_build_candidate_list ( Slapi_PBlock *pb )
if (( scope != LDAP_SCOPE_BASE ) && ( searchreferral )) {
- int i; - struct berval bv,*bvals[2]; - Slapi_Entry ** aciArray=(Slapi_Entry **) slapi_ch_malloc(2*sizeof(Slapi_Entry *)); - Slapi_Entry *anEntry = slapi_entry_alloc(); + int i; + struct berval bv,*bvals[2]; + Slapi_Entry ** aciArray=(Slapi_Entry **) slapi_ch_malloc(2*sizeof(Slapi_Entry *)); + Slapi_Entry *anEntry = slapi_entry_alloc();
- slapi_entry_set_dn(anEntry,slapi_ch_strdup(target)); + slapi_entry_set_sdn(anEntry, target_sdn);
- bvals[1]=NULL; - bvals[0]=&bv; - bv.bv_val="referral"; + bvals[1]=NULL; + bvals[0]=&bv; + bv.bv_val="referral"; bv.bv_len=strlen(bv.bv_val); - slapi_entry_add_values( anEntry, "objectclass", bvals); + slapi_entry_add_values( anEntry, "objectclass", bvals);
- slapi_rwlock_rdlock(cb->rwl_config_lock); + slapi_rwlock_rdlock(cb->rwl_config_lock); for (i=0; cb->url_array && cb->url_array[i]; i++) { char * anUrl = slapi_ch_smprintf("%s%s",cb->url_array[i],target); - bv.bv_val=anUrl; + bv.bv_val=anUrl; bv.bv_len=strlen(bv.bv_val); - slapi_entry_attr_merge( anEntry, "ref", bvals); + slapi_entry_attr_merge( anEntry, "ref", bvals); slapi_ch_free((void **)&anUrl); } - slapi_rwlock_unlock(cb->rwl_config_lock); + slapi_rwlock_unlock(cb->rwl_config_lock); aciArray[0]=anEntry; aciArray[1]=NULL; @@ -442,12 +446,12 @@ int chainingdb_next_search_entry ( Slapi_PBlock *pb ) {
- char *target; + Slapi_DN *target_sdn = NULL; int sizelimit, timelimit; int rc, parse_rc, retcode; int i, attrsonly; time_t optime; - LDAPMessage *res=NULL; + LDAPMessage *res=NULL; char *matched_msg,*error_msg; cb_searchContext *ctx=NULL; Slapi_Entry *entry; @@ -459,13 +463,13 @@ chainingdb_next_search_entry ( Slapi_PBlock *pb )
matched_msg=error_msg=NULL;
- slapi_pblock_get( pb, SLAPI_SEARCH_RESULT_SET, &ctx ); - slapi_pblock_get( pb, SLAPI_BACKEND, &be ); - slapi_pblock_get( pb, SLAPI_SEARCH_TIMELIMIT, &timelimit ); - slapi_pblock_get( pb, SLAPI_SEARCH_SIZELIMIT, &sizelimit ); - slapi_pblock_get( pb, SLAPI_SEARCH_TARGET, &target ); - slapi_pblock_get( pb, SLAPI_OPINITIATED_TIME, &optime ); - slapi_pblock_get( pb, SLAPI_SEARCH_ATTRSONLY, &attrsonly ); + slapi_pblock_get( pb, SLAPI_SEARCH_RESULT_SET, &ctx ); + slapi_pblock_get( pb, SLAPI_BACKEND, &be ); + slapi_pblock_get( pb, SLAPI_SEARCH_TIMELIMIT, &timelimit ); + slapi_pblock_get( pb, SLAPI_SEARCH_SIZELIMIT, &sizelimit ); + slapi_pblock_get( pb, SLAPI_SEARCH_TARGET_SDN, &target_sdn ); + slapi_pblock_get( pb, SLAPI_OPINITIATED_TIME, &optime ); + slapi_pblock_get( pb, SLAPI_SEARCH_ATTRSONLY, &attrsonly );
cb = cb_get_instance(be);
@@ -656,22 +660,22 @@ chainingdb_next_search_entry ( Slapi_PBlock *pb ) case LDAP_RES_SEARCH_REFERENCE:
/* The server sent a search reference encountered during the - * search operation. + * search operation. */ /* heart-beat management */ - if (cb->max_idle_time>0) - endtime=current_time() + cb->max_idle_time; + if (cb->max_idle_time>0) + endtime=current_time() + cb->max_idle_time;
parse_rc = ldap_parse_reference( ctx->ld, res, &referrals, NULL, 1 ); - if ( parse_rc != LDAP_SUCCESS ) { - cb_send_ldap_result( pb, LDAP_OPERATIONS_ERROR, NULL, - ldap_err2string( parse_rc ), 0, NULL); + if ( parse_rc != LDAP_SUCCESS ) { + cb_send_ldap_result( pb, LDAP_OPERATIONS_ERROR, NULL, + ldap_err2string( parse_rc ), 0, NULL); cb_release_op_connection(cb->pool,ctx->ld,CB_LDAP_CONN_ERROR(parse_rc)); slapi_ch_free((void **)&ctx);
- slapi_pblock_set( pb, SLAPI_SEARCH_RESULT_SET,NULL); - slapi_pblock_set( pb, SLAPI_SEARCH_RESULT_ENTRY,NULL); + slapi_pblock_set( pb, SLAPI_SEARCH_RESULT_SET,NULL); + slapi_pblock_set( pb, SLAPI_SEARCH_RESULT_ENTRY,NULL); return -1; }
@@ -681,27 +685,27 @@ chainingdb_next_search_entry ( Slapi_PBlock *pb )
{
- struct berval bv; + struct berval bv; int i; - struct berval *bvals[2]; - Slapi_Entry *anEntry = slapi_entry_alloc(); - slapi_entry_set_dn(anEntry,slapi_ch_strdup(target)); + struct berval *bvals[2]; + Slapi_Entry *anEntry = slapi_entry_alloc(); + slapi_entry_set_sdn(anEntry, target_sdn);
- bvals[1]=NULL; - bvals[0]=&bv; + bvals[1]=NULL; + bvals[0]=&bv;
- bv.bv_val="referral"; - bv.bv_len=strlen(bv.bv_val); - slapi_entry_add_values( anEntry, "objectclass", bvals); + bv.bv_val="referral"; + bv.bv_len=strlen(bv.bv_val); + slapi_entry_add_values( anEntry, "objectclass", bvals);
for (i=0;referrals[i] != NULL; i++) { - bv.bv_val=referrals[i]; + bv.bv_val=referrals[i]; bv.bv_len=strlen(bv.bv_val); - slapi_entry_add_values( anEntry, "ref", bvals); + slapi_entry_add_values( anEntry, "ref", bvals); }
- slapi_pblock_set( pb, SLAPI_SEARCH_RESULT_SET,ctx); - slapi_pblock_set( pb, SLAPI_SEARCH_RESULT_ENTRY,anEntry); + slapi_pblock_set( pb, SLAPI_SEARCH_RESULT_SET,ctx); + slapi_pblock_set( pb, SLAPI_SEARCH_RESULT_ENTRY,anEntry); cb_set_acl_policy(pb); }
diff --git a/ldap/servers/plugins/chainingdb/cb_utils.c b/ldap/servers/plugins/chainingdb/cb_utils.c index 3b0123c..2492226 100644 --- a/ldap/servers/plugins/chainingdb/cb_utils.c +++ b/ldap/servers/plugins/chainingdb/cb_utils.c @@ -50,7 +50,7 @@ char * cb_get_rootdn() { if (ret == NULL) ret = slapi_ch_strdup(CB_DIRECTORY_MANAGER_DN); if (ret) - slapi_dn_normalize_case(ret); /* UTF8-aware */ + slapi_dn_ignore_case(ret); /* UTF8-aware */ return ret; }
diff --git a/ldap/servers/plugins/cos/cos_cache.c b/ldap/servers/plugins/cos/cos_cache.c index bfb585e..6265728 100644 --- a/ldap/servers/plugins/cos/cos_cache.c +++ b/ldap/servers/plugins/cos/cos_cache.c @@ -679,57 +679,58 @@ static int cos_cache_build_definition_list(cosDefinitions **pDefs, int *vattr_ca if(pSuffixSearch) slapi_pblock_get( pSuffixSearch, SLAPI_PLUGIN_INTOP_RESULT, &ret);
- if(pSuffixSearch && ret == LDAP_SUCCESS) + if(!pSuffixSearch || ret != LDAP_SUCCESS) { + LDAPDebug( LDAP_DEBUG_ANY, + "cos_cache_build_definition_list: failed to find suffixes\n", + 0,0,0); + ret = -1; + goto next; + } + + /* iterate through the suffixes and search for cos definitions */ + slapi_pblock_get( pSuffixSearch, SLAPI_PLUGIN_INTOP_SEARCH_ENTRIES, + &pSuffixList ); + if(!pSuffixList) { + goto next; + } + while(pSuffixList[suffixIndex]) { - /* iterate through the suffixes and search for cos definitions */ - slapi_pblock_get( pSuffixSearch, SLAPI_PLUGIN_INTOP_SEARCH_ENTRIES, &pSuffixList); - if(pSuffixList) + if(!slapi_entry_first_attr(pSuffixList[suffixIndex], &suffixAttr)) { - while(pSuffixList[suffixIndex]) + do { - if(!slapi_entry_first_attr(pSuffixList[suffixIndex], &suffixAttr)) + attrType = 0; + slapi_attr_get_type(suffixAttr, &attrType); + if(attrType && !slapi_utf8casecmp((unsigned char*)attrType, (unsigned char*)"namingcontexts")) { - do + if(!slapi_attr_get_bervals_copy(suffixAttr, &suffixVals)) { - attrType = 0; - slapi_attr_get_type(suffixAttr, &attrType); - if(attrType && !slapi_utf8casecmp((unsigned char*)attrType, (unsigned char*)"namingcontexts")) + valIndex = 0; + + if(suffixVals) { - if(!slapi_attr_get_bervals_copy(suffixAttr, &suffixVals)) + while(suffixVals[valIndex]) { - valIndex = 0; - - if(suffixVals) - { - while(suffixVals[valIndex]) - { - /* here's a suffix, lets search it... */ - if(suffixVals[valIndex]->bv_val) - if(!cos_cache_add_dn_defs(suffixVals[valIndex]->bv_val ,pDefs, vattr_cacheable)) - cos_def_available = 1; - - valIndex++; - } + /* here's a suffix, lets search it... */ + if(suffixVals[valIndex]->bv_val) + if(!cos_cache_add_dn_defs(suffixVals[valIndex]->bv_val ,pDefs, vattr_cacheable)) + cos_def_available = 1; + + valIndex++; + }
- ber_bvecfree( suffixVals ); - suffixVals = NULL; - } - } + ber_bvecfree( suffixVals ); + suffixVals = NULL; } - - } while(!slapi_entry_next_attr(pSuffixList[suffixIndex], suffixAttr, &suffixAttr)); + } } - suffixIndex++; - } + + } while(!slapi_entry_next_attr(pSuffixList[suffixIndex], suffixAttr, &suffixAttr)); } + suffixIndex++; } - else - { - LDAPDebug( LDAP_DEBUG_ANY, "cos_cache_build_definition_list: failed to find suffixes\n",0,0,0); - ret = -1; - } - +next: if(cos_def_available == 0) { if(firstTime) @@ -768,7 +769,8 @@ struct dn_defs_info { * if a particular attempt to add a definition fails: info.ret gets set to * zero only if we succed to add a def. */ -static int cos_dn_defs_cb (Slapi_Entry* e, void *callback_data) { +static int cos_dn_defs_cb (Slapi_Entry* e, void *callback_data) +{ struct dn_defs_info *info; cosAttrValue **pSneakyVal = 0; cosAttrValue *pObjectclass = 0; @@ -793,286 +795,276 @@ static int cos_dn_defs_cb (Slapi_Entry* e, void *callback_data) { info->vattr_cacheable = -1;
cos_cache_add_attrval(&pDn, slapi_entry_get_dn(e)); - if(!slapi_entry_first_attr(e, &dnAttr)) - { - do + if(slapi_entry_first_attr(e, &dnAttr)) { + goto bail; + } + + do { + attrType = 0; + /* we need to fill in the details of the definition now */ + slapi_attr_get_type(dnAttr, &attrType); + if(!attrType) { + continue; + } + pSneakyVal = 0; + if(!slapi_utf8casecmp((unsigned char*)attrType, (unsigned char*)"objectclass")) + pSneakyVal = &pObjectclass; + else if(!slapi_utf8casecmp((unsigned char*)attrType, (unsigned char*)"cosTargetTree")) + pSneakyVal = &pCosTargetTree; + else if(!slapi_utf8casecmp((unsigned char*)attrType, (unsigned char*)"cosTemplateDn")) + pSneakyVal = &pCosTemplateDn; + else if(!slapi_utf8casecmp((unsigned char*)attrType, (unsigned char*)"cosSpecifier")) + pSneakyVal = &pCosSpecifier; + else if(!slapi_utf8casecmp((unsigned char*)attrType, (unsigned char*)"cosAttribute")) + pSneakyVal = &pCosAttribute; + else if(!slapi_utf8casecmp((unsigned char*)attrType, (unsigned char*)"cosIndirectSpecifier")) + pSneakyVal = &pCosSpecifier; + if(!pSneakyVal) { + continue; + } + /* It's a type we're interested in */ + if(slapi_attr_get_bervals_copy(dnAttr, &dnVals)) { + continue; + } + valIndex = 0; + if(!dnVals) { + continue; + } + for (valIndex = 0; dnVals[valIndex]; valIndex++) { - attrType = 0; - /* we need to fill in the details of the definition now */ - slapi_attr_get_type(dnAttr, &attrType); - if(attrType) + if(!dnVals[valIndex]->bv_val) { + continue; + } + /* + parse any overide or default values + and deal with them + */ + if(pSneakyVal == &pCosAttribute) { - pSneakyVal = 0; - if(!slapi_utf8casecmp((unsigned char*)attrType, (unsigned char*)"objectclass")) - pSneakyVal = &pObjectclass; - else if(!slapi_utf8casecmp((unsigned char*)attrType, (unsigned char*)"cosTargetTree")) - pSneakyVal = &pCosTargetTree; - else if(!slapi_utf8casecmp((unsigned char*)attrType, (unsigned char*)"cosTemplateDn")) - pSneakyVal = &pCosTemplateDn; - else if(!slapi_utf8casecmp((unsigned char*)attrType, (unsigned char*)"cosSpecifier")) - pSneakyVal = &pCosSpecifier; - else if(!slapi_utf8casecmp((unsigned char*)attrType, (unsigned char*)"cosAttribute")) - pSneakyVal = &pCosAttribute; - else if(!slapi_utf8casecmp((unsigned char*)attrType, (unsigned char*)"cosIndirectSpecifier")) - pSneakyVal = &pCosSpecifier; - if(pSneakyVal) + int qualifier_hit = 0; + int op_qualifier_hit = 0; + int merge_schemes_qualifier_hit = 0; + int override_qualifier_hit =0; + int default_qualifier_hit = 0; + int operational_default_qualifier_hit = 0; + do { - /* It's a type we're interested in */ - if(!slapi_attr_get_bervals_copy(dnAttr, &dnVals)) + qualifier_hit = 0; + + if(cos_cache_backwards_stricmp_and_clip(dnVals[valIndex]->bv_val, " operational")) { - valIndex = 0; - if(dnVals) - { - while(dnVals[valIndex]) - { - if(dnVals[valIndex]->bv_val) - { - /* - parse any overide or default values - and deal with them - */ - if(pSneakyVal == &pCosAttribute) - { - int qualifier_hit = 0; - int op_qualifier_hit = 0; - int merge_schemes_qualifier_hit = 0; - int override_qualifier_hit =0; - int default_qualifier_hit = 0; - int operational_default_qualifier_hit = 0; - do - { - qualifier_hit = 0; + /* matched */ + op_qualifier_hit = 1; + qualifier_hit = 1; + } + + if(cos_cache_backwards_stricmp_and_clip(dnVals[valIndex]->bv_val, " merge-schemes")) + { + /* matched */ + merge_schemes_qualifier_hit = 1; + qualifier_hit = 1; + }
- if(cos_cache_backwards_stricmp_and_clip(dnVals[valIndex]->bv_val, " operational")) - { - /* matched */ - op_qualifier_hit = 1; - qualifier_hit = 1; - } - - if(cos_cache_backwards_stricmp_and_clip(dnVals[valIndex]->bv_val, " merge-schemes")) - { - /* matched */ - merge_schemes_qualifier_hit = 1; - qualifier_hit = 1; - } + if(cos_cache_backwards_stricmp_and_clip(dnVals[valIndex]->bv_val, " override")) + { + /* matched */ + override_qualifier_hit = 1; + qualifier_hit = 1; + } + + if(cos_cache_backwards_stricmp_and_clip(dnVals[valIndex]->bv_val, " default")) { + default_qualifier_hit = 1; + qualifier_hit = 1; + }
- if(cos_cache_backwards_stricmp_and_clip(dnVals[valIndex]->bv_val, " override")) - { - /* matched */ - override_qualifier_hit = 1; - qualifier_hit = 1; - } - - if(cos_cache_backwards_stricmp_and_clip(dnVals[valIndex]->bv_val, " default")) { - default_qualifier_hit = 1; - qualifier_hit = 1; - } + if(cos_cache_backwards_stricmp_and_clip(dnVals[valIndex]->bv_val, " operational-default")) { + operational_default_qualifier_hit = 1; + qualifier_hit = 1; + } + } + while(qualifier_hit == 1);
- if(cos_cache_backwards_stricmp_and_clip(dnVals[valIndex]->bv_val, " operational-default")) { - operational_default_qualifier_hit = 1; - qualifier_hit = 1; - } - } - while(qualifier_hit == 1); - - /* - * At this point, dnVals[valIndex]->bv_val - * is the value of cosAttribute, stripped of - * any qualifiers, so add this pure attribute type to - * the appropriate lists. - */ - - if ( op_qualifier_hit ) { - cos_cache_add_attrval(&pCosOperational, - dnVals[valIndex]->bv_val); - } - if ( merge_schemes_qualifier_hit ) { - cos_cache_add_attrval(&pCosMerge, - dnVals[valIndex]->bv_val); - } - if ( override_qualifier_hit ) { - cos_cache_add_attrval(&pCosOverrides, - dnVals[valIndex]->bv_val); - } - if ( default_qualifier_hit ) { - /* attr is added below in pSneakyVal, in any case */ - } + /* + * At this point, dnVals[valIndex]->bv_val + * is the value of cosAttribute, stripped of + * any qualifiers, so add this pure attribute type to + * the appropriate lists. + */ + + if ( op_qualifier_hit ) { + cos_cache_add_attrval(&pCosOperational, + dnVals[valIndex]->bv_val); + } + if ( merge_schemes_qualifier_hit ) { + cos_cache_add_attrval(&pCosMerge, dnVals[valIndex]->bv_val); + } + if ( override_qualifier_hit ) { + cos_cache_add_attrval(&pCosOverrides, + dnVals[valIndex]->bv_val); + } + if ( default_qualifier_hit ) { + /* attr is added below in pSneakyVal, in any case */ + }
- if ( operational_default_qualifier_hit ) { - cos_cache_add_attrval(&pCosOpDefault, - dnVals[valIndex]->bv_val); - } + if ( operational_default_qualifier_hit ) { + cos_cache_add_attrval(&pCosOpDefault, + dnVals[valIndex]->bv_val); + }
- if(!pCosTargetTree) - { - /* get the parent of the definition */ - - char *parent = NULL; - size_t plen = 0; - int rc = 0; - char *orig = slapi_dn_parent(pDn->val); - rc = slapi_dn_normalize_ext(orig, - 0, &parent, &plen); - if (rc < 0) { - LDAPDebug(LDAP_DEBUG_ANY, - "cos_cache_build_definition_list: failed to normalize parent dn %s. Adding the pre normalized dn.\n", orig, 0, 0); - parent = orig; - } else if (rc == 0) { - /* passed in. not terminated */ - *(parent + plen) = '\0'; - } - - cos_cache_add_attrval(&pCosTargetTree, parent); - if(!pCosTemplateDn) - cos_cache_add_attrval(&pCosTemplateDn, parent); - - if (orig != parent) { - slapi_ch_free_string(&orig); - } - slapi_ch_free_string(&parent); - } - - slapi_vattrspi_regattr((vattr_sp_handle *)vattr_handle, dnVals[valIndex]->bv_val, NULL, NULL); - } /* if(attrType is cosAttribute) */ - - /* - * Add the attributetype to the appropriate - * list. - */ - cos_cache_add_attrval(pSneakyVal, - dnVals[valIndex]->bv_val); - }/*if(dnVals[valIndex]->bv_val)*/ - - valIndex++; - }/* while(dnVals[valIndex]) */ - - ber_bvecfree( dnVals ); - dnVals = NULL; - }/*if(dnVals)*/ + if(!pCosTargetTree) + { + /* get the parent of the definition */ + char *orig = slapi_dn_parent(pDn->val); + Slapi_DN *psdn = slapi_sdn_new_dn_byval(orig); + char *parent = (char *)slapi_sdn_get_dn(psdn); + if (!parent) { + parent = (char *)slapi_sdn_get_udn(psdn); + LDAPDebug(LDAP_DEBUG_ANY, + "cos_cache_build_definition_list: " + "failed to normalize parent dn %s. " + "Adding the pre normalized dn.\n", + parent, 0, 0); } - }/*if(pSneakyVal)*/ - }/*if(attrType)*/ + cos_cache_add_attrval(&pCosTargetTree, parent); + if (!pCosTemplateDn) { + cos_cache_add_attrval(&pCosTemplateDn, parent); + } + slapi_sdn_free(&psdn); + } + + slapi_vattrspi_regattr((vattr_sp_handle *)vattr_handle, + dnVals[valIndex]->bv_val, NULL, NULL); + } /* if(attrType is cosAttribute) */ + + /* + * Add the attributetype to the appropriate + * list. + */ + cos_cache_add_attrval(pSneakyVal, dnVals[valIndex]->bv_val); - } while(!slapi_entry_next_attr(e, dnAttr, &dnAttr)); + }/* for (valIndex = 0; dnVals[valIndex]; valIndex++) */ - /* - determine the type of class of service scheme - */ - - if(pObjectclass) + ber_bvecfree( dnVals ); + dnVals = NULL; + } while(!slapi_entry_next_attr(e, dnAttr, &dnAttr)); + + /* + determine the type of class of service scheme + */ + + if(pObjectclass) + { + if(cos_cache_attrval_exists(pObjectclass, "cosDefinition")) { - if(cos_cache_attrval_exists(pObjectclass, "cosDefinition")) - { - cosType = COSTYPE_CLASSIC; - } - else if(cos_cache_attrval_exists(pObjectclass, "cosClassicDefinition")) - { - cosType = COSTYPE_CLASSIC; - - } - else if(cos_cache_attrval_exists(pObjectclass, "cosPointerDefinition")) - { - cosType = COSTYPE_POINTER; - - } - else if(cos_cache_attrval_exists(pObjectclass, "cosIndirectDefinition")) - { - cosType = COSTYPE_INDIRECT; - - } - else - cosType = COSTYPE_BADTYPE; + cosType = COSTYPE_CLASSIC; } - - /* - we should now have a full definition, - do some sanity checks because we don't - want bogus entries in the cache - then ship it - */ - - /* these must exist */ - if( pDn && - pObjectclass && + else if(cos_cache_attrval_exists(pObjectclass, "cosClassicDefinition")) + { + cosType = COSTYPE_CLASSIC; - ( - (cosType == COSTYPE_CLASSIC && - pCosTemplateDn && - pCosSpecifier && - pCosAttribute ) - || - (cosType == COSTYPE_POINTER && - pCosTemplateDn && - pCosAttribute ) - || - (cosType == COSTYPE_INDIRECT && - pCosSpecifier && - pCosAttribute ) - ) - ) + } + else if(cos_cache_attrval_exists(pObjectclass, "cosPointerDefinition")) { - int rc = 0; - /* - we'll leave the referential integrity stuff - up to the referint plug-in and assume all - is good - if it's not then we just have a - useless definition and we'll nag copiously later. - */ - char *pTmpDn = slapi_ch_strdup(pDn->val); /* because dn gets hosed on error */ - char ebuf[ BUFSIZ ]; + cosType = COSTYPE_POINTER; - if(!(rc = cos_cache_add_defn(info->pDefs, &pDn, cosType, - &pCosTargetTree, &pCosTemplateDn, - &pCosSpecifier, &pCosAttribute, - &pCosOverrides, &pCosOperational, - &pCosMerge, &pCosOpDefault))) { - info->ret = 0; /* we have succeeded to add the defn*/ - } else { - /* - * Failed but we will continue the search for other defs - * Don't reset info->ret....it keeps track of any success - */ - if ( rc == COS_DEF_ERROR_NO_TEMPLATES) { - LDAPDebug(LDAP_DEBUG_ANY, "Skipping CoS Definition %s" - "--no CoS Templates found, " - "which should be added before the CoS Definition.\n", - escape_string(pTmpDn, ebuf), 0, 0); - } else { - LDAPDebug(LDAP_DEBUG_ANY, "Skipping CoS Definition %s\n" - "--error(%d)\n", - escape_string(pTmpDn, ebuf), rc, 0); - } - } + } + else if(cos_cache_attrval_exists(pObjectclass, "cosIndirectDefinition")) + { + cosType = COSTYPE_INDIRECT; - slapi_ch_free_string(&pTmpDn); } else - { - /* - this definition is brain dead - bail - if we have a dn use it to report, if not then *really* bad - things are going on + cosType = COSTYPE_BADTYPE; + } + + /* + we should now have a full definition, + do some sanity checks because we don't + want bogus entries in the cache + then ship it + */ + + /* these must exist */ + if( pDn && + pObjectclass && + + ( + (cosType == COSTYPE_CLASSIC && + pCosTemplateDn && + pCosSpecifier && + pCosAttribute ) + || + (cosType == COSTYPE_POINTER && + pCosTemplateDn && + pCosAttribute ) + || + (cosType == COSTYPE_INDIRECT && + pCosSpecifier && + pCosAttribute ) + ) + ) + { + int rc = 0; + /* + we'll leave the referential integrity stuff + up to the referint plug-in and assume all + is good - if it's not then we just have a + useless definition and we'll nag copiously later. + */ + char *pTmpDn = slapi_ch_strdup(pDn->val); /* because dn gets hosed on error */ + char ebuf[ BUFSIZ ]; + + if(!(rc = cos_cache_add_defn(info->pDefs, &pDn, cosType, + &pCosTargetTree, &pCosTemplateDn, + &pCosSpecifier, &pCosAttribute, + &pCosOverrides, &pCosOperational, + &pCosMerge, &pCosOpDefault))) { + info->ret = 0; /* we have succeeded to add the defn*/ + } else { + /* + * Failed but we will continue the search for other defs + * Don't reset info->ret....it keeps track of any success */ - if(pDn) - { - LDAPDebug( LDAP_DEBUG_ANY, "cos_cache_add_dn_defs: incomplete cos definition detected in %s, discarding from cache.\n",pDn->val,0,0); + if ( rc == COS_DEF_ERROR_NO_TEMPLATES) { + LDAPDebug(LDAP_DEBUG_ANY, "Skipping CoS Definition %s" + "--no CoS Templates found, " + "which should be added before the CoS Definition.\n", + escape_string(pTmpDn, ebuf), 0, 0); + } else { + LDAPDebug(LDAP_DEBUG_ANY, "Skipping CoS Definition %s\n" + "--error(%d)\n", + escape_string(pTmpDn, ebuf), rc, 0); } - else - LDAPDebug( LDAP_DEBUG_ANY, "cos_cache_add_dn_defs: incomplete cos definition detected, no DN to report, discarding from cache.\n",0,0,0); - - if(pCosTargetTree) - cos_cache_del_attrval_list(&pCosTargetTree); - if(pCosTemplateDn) - cos_cache_del_attrval_list(&pCosTemplateDn); - if(pCosSpecifier) - cos_cache_del_attrval_list(&pCosSpecifier); - if(pCosAttribute) - cos_cache_del_attrval_list(&pCosAttribute); - if(pDn) - cos_cache_del_attrval_list(&pDn); } - }/*if(!slapi_entry_first_attr(e, &dnAttr))*/ + + slapi_ch_free_string(&pTmpDn); + } + else + { + /* + this definition is brain dead - bail + if we have a dn use it to report, if not then *really* bad + things are going on + */ + if(pDn) + { + LDAPDebug( LDAP_DEBUG_ANY, "cos_cache_add_dn_defs: incomplete cos definition detected in %s, discarding from cache.\n",pDn->val,0,0); + } + else + LDAPDebug( LDAP_DEBUG_ANY, "cos_cache_add_dn_defs: incomplete cos definition detected, no DN to report, discarding from cache.\n",0,0,0); + + if(pCosTargetTree) + cos_cache_del_attrval_list(&pCosTargetTree); + if(pCosTemplateDn) + cos_cache_del_attrval_list(&pCosTemplateDn); + if(pCosSpecifier) + cos_cache_del_attrval_list(&pCosSpecifier); + if(pCosAttribute) + cos_cache_del_attrval_list(&pCosAttribute); + if(pDn) + cos_cache_del_attrval_list(&pDn); + } +bail: /* we don't keep the objectclasses, so lets free them */ if(pObjectclass) { cos_cache_del_attrval_list(&pObjectclass); @@ -1544,7 +1536,8 @@ static void cos_cache_del_attrval_list(cosAttrValue **pVal) --------------------- adds a value to an attribute value list */ -static int cos_cache_add_attrval(cosAttrValue **attrval, char *val) +static int +cos_cache_add_attrval(cosAttrValue **attrval, char *val) { int ret = 0; cosAttrValue *theVal; @@ -1953,36 +1946,28 @@ static int cos_cache_add_tmpl(cosTemplates **pTemplates, cosAttrValue *dn, cosAt char *grade = NULL; int grade_index = 0; int index = 0; - int lastindex = 0; int template_default = 0; - char *dnval = NULL; - size_t dnlen = 0; - int rc = 0; - - rc = slapi_dn_normalize_ext(dn->val, 0, &dnval, &dnlen); - if (rc < 0) { + char *ptr = NULL; + char *normed = slapi_create_dn_string("%s", dn->val); + if (normed) { + slapi_ch_free_string(&dn->val); + dn->val = normed; + } else { LDAPDebug(LDAP_DEBUG_ANY, "cos_cache_add_tmpl: failed to normalize dn %s. " - "Processing the pre normalized dn.\n", dn->val, 0, 0); - } else if (rc == 0) { - /* passed in. not terminated */ - *(dnval + dnlen) = '\0'; - } else { - slapi_ch_free_string(&dn->val); - dn->val = dnval; + "Processing the pre normalized dn.\n", + dn->val, 0, 0); } grade = (char*)slapi_ch_malloc(strlen(dn->val)+1);
/* extract the cos grade */ - while(dn->val[index] != '=' && dn->val[index] != '\0') - index++; - lastindex = strlen(dn->val) - 1; - - if(dn->val[index] == '=') + ptr = strchr(dn->val, '='); + + if (ptr) { int quotes = 0; - - index++; + int lastindex = strlen(dn->val) - 1; + index = ptr - dn->val + 1;
/* copy the grade (supports one level of quote nesting in rdn) */ while(dn->val[index] != ',' || dn->val[index-1] == '\' || quotes == 1) @@ -2405,21 +2390,15 @@ static int cos_cache_query_attr(cos_cache *ptheCache, vattr_context *context, Sl while((hit == 0 || merge_mode) && pTargetTree) { { - int rc = 0; - char *tval = NULL; - size_t tlen = 0; - rc = slapi_dn_normalize_ext(pTargetTree->val, 0, &tval, &tlen); - if (rc < 0) { + char *normed = slapi_create_dn_string("%s", pTargetTree->val); + if (normed) { + slapi_ch_free_string(&pTargetTree->val); + pTargetTree->val = normed; + } else { LDAPDebug(LDAP_DEBUG_ANY, "cos_cache_query_attr: failed to normalize dn %s. " "Processing the pre normalized dn.\n", pTargetTree->val, 0, 0); - } else if (rc == 0) { - /* passed in. not terminated */ - *(tval + tlen) = '\0'; - } else { - slapi_ch_free_string(&pTargetTree->val); - pTargetTree->val = tval; } } if( pTargetTree->val == 0 || @@ -2943,22 +2922,15 @@ static int cos_cache_index_all(cosCache *pCache)
while(pAttrVal) { - int rc = 0; - char *dnval = NULL; - size_t dnlen = 0; - rc = slapi_dn_normalize_ext(pAttrVal->val, 0, - &dnval, &dnlen); - if (rc < 0) { + char *normed = slapi_create_dn_string("%s", pAttrVal->val); + if (normed) { + slapi_ch_free_string(&pAttrVal->val); + pAttrVal->val = normed; + } else { LDAPDebug(LDAP_DEBUG_ANY, "cos_cache_index_all: failed to normalize dn %s. " "Processing the pre normalized dn.\n", pAttrVal->val, 0, 0); - } else if (rc == 0) { - /* passed in. not terminated */ - *(dnval + dnlen) = '\0'; - } else { - slapi_ch_free_string(&pAttrVal->val); - pAttrVal->val = dnval; } pCache->ppTemplateList[tmpindex] = pAttrVal->val;
@@ -3356,7 +3328,8 @@ bail: */ void cos_cache_change_notify(Slapi_PBlock *pb) { - char *dn; + const char *dn; + Slapi_DN *sdn = NULL; int do_update = 0; struct slapi_entry *e; Slapi_Backend *be=NULL; @@ -3372,11 +3345,12 @@ void cos_cache_change_notify(Slapi_PBlock *pb) goto bail;
/* need to work out if a cache rebuild is necessary */ - if(slapi_pblock_get( pb, SLAPI_TARGET_DN, &dn )) + if(slapi_pblock_get( pb, SLAPI_TARGET_SDN, &sdn )) { LDAPDebug( LDAP_DEBUG_ANY, "cos_cache_change_notify: failed to get dn of changed entry",0,0,0); goto bail; } + dn = slapi_sdn_get_dn(sdn);
slapi_pblock_get(pb, SLAPI_PLUGIN_OPRETURN, &rc); if (0 != rc) { diff --git a/ldap/servers/plugins/dna/dna.c b/ldap/servers/plugins/dna/dna.c index 2f4dd02..858a0d7 100644 --- a/ldap/servers/plugins/dna/dna.c +++ b/ldap/servers/plugins/dna/dna.c @@ -172,7 +172,7 @@ static PRCList *dna_global_config = NULL; static Slapi_RWLock *g_dna_cache_lock;
static void *_PluginID = NULL; -static char *_PluginDN = NULL; +static const char *_PluginDN = NULL;
static int g_plugin_started = 0;
@@ -227,6 +227,7 @@ static int dna_load_host_port(); * */ static char *dna_get_dn(Slapi_PBlock * pb); +static Slapi_DN *dna_get_sdn(Slapi_PBlock * pb); static int dna_dn_is_config(char *dn); static int dna_get_next_value(struct configEntry * config_entry, char **next_value_ret); @@ -330,12 +331,12 @@ void *getPluginID() return _PluginID; }
-void setPluginDN(char *pluginDN) +void setPluginDN(const char *pluginDN) { _PluginDN = pluginDN; }
-char *getPluginDN() +const char *getPluginDN() { return _PluginDN; } @@ -489,7 +490,8 @@ dna_exop_init(Slapi_PBlock * pb) static int dna_start(Slapi_PBlock * pb) { - char *plugindn = NULL; + Slapi_DN *pluginsdn = NULL; + const char *plugindn = NULL;
slapi_log_error(SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM, "--> dna_start\n"); @@ -513,12 +515,13 @@ dna_start(Slapi_PBlock * pb) * and store it for future use. This should avoid * hardcoding of DN's in the code. */ - slapi_pblock_get(pb, SLAPI_TARGET_DN, &plugindn); - if (NULL == plugindn || 0 == strlen(plugindn)) { + slapi_pblock_get(pb, SLAPI_TARGET_SDN, &pluginsdn); + if (NULL == pluginsdn || 0 == slapi_sdn_get_ndn_len(pluginsdn)) { slapi_log_error(SLAPI_LOG_PLUGIN, DNA_PLUGIN_SUBSYSTEM, "dna_start: had to use hard coded config dn\n"); plugindn = DNA_DN; } else { + plugindn = slapi_sdn_get_dn(pluginsdn); slapi_log_error(SLAPI_LOG_PLUGIN, DNA_PLUGIN_SUBSYSTEM, "dna_start: config at %s\n", plugindn);
@@ -857,12 +860,17 @@ dna_parse_config_entry(Slapi_Entry * e, int apply) Slapi_DN *sdn = NULL; char *normdn = NULL;
- sdn = slapi_sdn_new_dn_byref(value); + sdn = slapi_sdn_new_dn_passin(value);
- if (sdn) { - slapi_search_internal_get_entry(sdn, NULL, &shared_e, getPluginID()); - slapi_sdn_free(&sdn); + if (!sdn) { + slapi_log_error(SLAPI_LOG_FATAL, DNA_PLUGIN_SUBSYSTEM, + "dna_parse_config_entry: Unable to create " + "slapi_dn (%s)\n", value); + ret = DNA_FAILURE; + slapi_ch_free_string(&value); + goto bail; } + slapi_search_internal_get_entry(sdn, NULL, &shared_e, getPluginID());
/* Make sure that the shared config entry exists. */ if (!shared_e) { @@ -872,23 +880,23 @@ dna_parse_config_entry(Slapi_Entry * e, int apply) "dna_parse_config_entry: Unable to locate " "shared configuration entry (%s)\n", value); ret = DNA_FAILURE; - slapi_ch_free_string(&value); + slapi_sdn_free(&sdn); goto bail; } else { slapi_entry_free(shared_e); shared_e = NULL; }
- normdn = slapi_create_dn_string("%s", value); + normdn = (char *)slapi_sdn_get_dn(sdn); if (NULL == normdn) { slapi_log_error(SLAPI_LOG_FATAL, DNA_PLUGIN_SUBSYSTEM, "dna_parse_config_entry: failed to normalize dn: " "%s\n", value); ret = DNA_FAILURE; - slapi_ch_free_string(&value); + slapi_sdn_free(&sdn); goto bail; } - entry->shared_cfg_base = normdn; + entry->shared_cfg_base = slapi_ch_strdup(normdn);
/* We prepend the host & port of this instance as a * multi-part RDN for the shared config entry. */ @@ -900,7 +908,7 @@ dna_parse_config_entry(Slapi_Entry * e, int apply) "%s=%s+%s=%s,%s", DNA_HOSTNAME, hostname, DNA_PORTNUM, portnum, value); ret = DNA_FAILURE; - slapi_ch_free_string(&value); + slapi_sdn_free(&sdn); goto bail; } entry->shared_cfg_dn = normdn; @@ -908,7 +916,7 @@ dna_parse_config_entry(Slapi_Entry * e, int apply) slapi_log_error(SLAPI_LOG_CONFIG, DNA_PLUGIN_SUBSYSTEM, "----------> %s [%s]\n", DNA_SHARED_CFG_DN, entry->shared_cfg_base); - slapi_ch_free_string(&value); + slapi_sdn_free(&sdn); }
value = slapi_entry_attr_get_charptr(e, DNA_THRESHOLD); @@ -1725,11 +1733,11 @@ bail:
static char *dna_get_dn(Slapi_PBlock * pb) { - char *dn = 0; + Slapi_DN *sdn = 0; slapi_log_error(SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM, "--> dna_get_dn\n");
- if (slapi_pblock_get(pb, SLAPI_TARGET_DN, &dn)) { + if (slapi_pblock_get(pb, SLAPI_TARGET_SDN, &sdn)) { slapi_log_error(SLAPI_LOG_FATAL, DNA_PLUGIN_SUBSYSTEM, "dna_get_dn: failed to get dn of changed entry"); goto bail; @@ -1739,7 +1747,20 @@ static char *dna_get_dn(Slapi_PBlock * pb) slapi_log_error(SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM, "<-- dna_get_dn\n");
- return dn; + return (char *)slapi_sdn_get_dn(sdn); +} + +static Slapi_DN * +dna_get_sdn(Slapi_PBlock * pb) +{ + Slapi_DN *sdn = 0; + slapi_log_error(SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM, + "--> dna_get_sdn\n"); + slapi_pblock_get(pb, SLAPI_TARGET_SDN, &sdn); + slapi_log_error(SLAPI_LOG_TRACE, DNA_PLUGIN_SUBSYSTEM, + "<-- dna_get_sdn\n"); + + return sdn; }
/* config check @@ -2785,10 +2806,9 @@ static int dna_pre_op(Slapi_PBlock * pb, int modtype) * slapi_pblock_get( pb, SLAPI_MODIFY_EXISTING_ENTRY, &e); */ - Slapi_DN *tmp_dn = slapi_sdn_new_dn_byref(dn); + Slapi_DN *tmp_dn = dna_get_sdn(pb); if (tmp_dn) { slapi_search_internal_get_entry(tmp_dn, 0, &e, getPluginID()); - slapi_sdn_free(&tmp_dn); free_entry = 1; }
diff --git a/ldap/servers/plugins/linkedattrs/fixup_task.c b/ldap/servers/plugins/linkedattrs/fixup_task.c index d550570..d5d0b14 100644 --- a/ldap/servers/plugins/linkedattrs/fixup_task.c +++ b/ldap/servers/plugins/linkedattrs/fixup_task.c @@ -279,7 +279,7 @@ static int linked_attrs_remove_backlinks_callback(Slapi_Entry *e, void *callback_data) { int rc = 0; - char *dn = slapi_entry_get_dn(e); + Slapi_DN *sdn = slapi_entry_get_sdn(e); char *type = (char *)callback_data; Slapi_PBlock *pb = slapi_pblock_new(); char *val[1]; @@ -298,11 +298,11 @@ linked_attrs_remove_backlinks_callback(Slapi_Entry *e, void *callback_data)
slapi_log_error(SLAPI_LOG_PLUGIN, LINK_PLUGIN_SUBSYSTEM, "Removing backpointer attribute (%s) from entry (%s)\n", - type, dn); + type, slapi_sdn_get_dn(sdn));
/* Perform the operation. */ - slapi_modify_internal_set_pb(pb, dn, mods, 0, 0, - linked_attrs_get_plugin_id(), 0); + slapi_modify_internal_set_pb_ext(pb, sdn, mods, 0, 0, + linked_attrs_get_plugin_id(), 0); slapi_modify_internal_pb(pb);
slapi_pblock_destroy(pb); @@ -339,6 +339,7 @@ linked_attrs_add_backlinks_callback(Slapi_Entry *e, void *callback_data) for (i = 0; targets && targets[i]; ++i) { char *targetdn = (char *)targets[i]; int perform_update = 0; + Slapi_DN *targetsdn = slapi_sdn_new_dn_byref(targetdn);
if (config->scope) { /* Check if the target is within the scope. */ @@ -348,14 +349,12 @@ linked_attrs_add_backlinks_callback(Slapi_Entry *e, void *callback_data) * and see if the target is in the same backend. */ Slapi_Backend *be = NULL; Slapi_DN *linksdn = slapi_sdn_new_dn_byref(linkdn); - Slapi_DN *targetsdn = slapi_sdn_new_dn_byref(targetdn);
if ((be = slapi_be_select(linksdn))) { perform_update = slapi_sdn_issuffix(targetsdn, slapi_be_getsuffix(be, 0)); }
slapi_sdn_free(&linksdn); - slapi_sdn_free(&targetsdn); }
if (perform_update) { @@ -364,13 +363,14 @@ linked_attrs_add_backlinks_callback(Slapi_Entry *e, void *callback_data) linkdn, targetdn);
/* Perform the modify operation. */ - slapi_modify_internal_set_pb(pb, targetdn, mods, 0, 0, - linked_attrs_get_plugin_id(), 0); + slapi_modify_internal_set_pb_ext(pb, targetsdn, mods, 0, 0, + linked_attrs_get_plugin_id(), 0); slapi_modify_internal_pb(pb);
/* Initialize the pblock so we can reuse it. */ slapi_pblock_init(pb); } + slapi_sdn_free(&targetsdn); }
slapi_ch_array_free(targets); diff --git a/ldap/servers/plugins/linkedattrs/linked_attrs.c b/ldap/servers/plugins/linkedattrs/linked_attrs.c index 75df753..5c6d462 100644 --- a/ldap/servers/plugins/linkedattrs/linked_attrs.c +++ b/ldap/servers/plugins/linkedattrs/linked_attrs.c @@ -94,6 +94,7 @@ static void linked_attrs_free_config_entry(struct configEntry ** entry); * helpers */ static char *linked_attrs_get_dn(Slapi_PBlock * pb); +static Slapi_DN *linked_attrs_get_sdn(Slapi_PBlock * pb); static int linked_attrs_dn_is_config(char *dn); static void linked_attrs_find_config(const char *dn, const char *type, struct configEntry **config); @@ -152,9 +153,9 @@ linked_attrs_get_plugin_id() }
void -linked_attrs_set_plugin_dn(char *pluginDN) +linked_attrs_set_plugin_dn(const char *pluginDN) { - _PluginDN = pluginDN; + _PluginDN = (char *)pluginDN; }
char * @@ -281,7 +282,7 @@ linked_attrs_postop_init(Slapi_PBlock *pb) static int linked_attrs_start(Slapi_PBlock * pb) { - char *plugindn = NULL; + Slapi_DN *plugindn = NULL;
slapi_log_error(SLAPI_LOG_TRACE, LINK_PLUGIN_SUBSYSTEM, "--> linked_attrs_start\n"); @@ -303,14 +304,14 @@ linked_attrs_start(Slapi_PBlock * pb) /* * Get the plug-in target dn from the system * and store it for future use. */ - slapi_pblock_get(pb, SLAPI_TARGET_DN, &plugindn); - if (NULL == plugindn || 0 == strlen(plugindn)) { + slapi_pblock_get(pb, SLAPI_TARGET_SDN, &plugindn); + if (NULL == plugindn || 0 == slapi_sdn_get_ndn_len(plugindn)) { slapi_log_error(SLAPI_LOG_PLUGIN, LINK_PLUGIN_SUBSYSTEM, "linked_attrs_start: unable to retrieve plugin dn\n"); return -1; }
- linked_attrs_set_plugin_dn(plugindn); + linked_attrs_set_plugin_dn(slapi_sdn_get_dn(plugindn));
/* * Load the config cache @@ -540,7 +541,7 @@ linked_attrs_parse_config_entry(Slapi_Entry * e, int apply) char *syntaxoid = NULL; Slapi_Attr *attr = slapi_attr_new();
- /* Set this first so we free it if we encounter an error */ + /* Set this first so we free it if we encounter an error */ entry->managedtype = value;
/* Gather some information about this attribute. */ @@ -816,21 +817,36 @@ linked_attrs_delete_config() static char * linked_attrs_get_dn(Slapi_PBlock * pb) { - char *dn = 0; + const char *dn = 0; + Slapi_DN *sdn = NULL; slapi_log_error(SLAPI_LOG_TRACE, LINK_PLUGIN_SUBSYSTEM, "--> linked_attrs_get_dn\n");
- if (slapi_pblock_get(pb, SLAPI_TARGET_DN, &dn)) { + if (slapi_pblock_get(pb, SLAPI_TARGET_SDN, &sdn)) { slapi_log_error(SLAPI_LOG_FATAL, LINK_PLUGIN_SUBSYSTEM, "linked_attrs_get_dn: failed to get dn of changed entry"); goto bail; } + dn = slapi_sdn_get_dn(sdn);
bail: slapi_log_error(SLAPI_LOG_TRACE, LINK_PLUGIN_SUBSYSTEM, "<-- linked_attrs_get_dn\n");
- return dn; + return (char *)dn; +} + +static Slapi_DN * +linked_attrs_get_sdn(Slapi_PBlock * pb) +{ + Slapi_DN *sdn = 0; + slapi_log_error(SLAPI_LOG_TRACE, LINK_PLUGIN_SUBSYSTEM, + "--> linked_attrs_get_sdn\n"); + slapi_pblock_get(pb, SLAPI_TARGET_SDN, &sdn); + slapi_log_error(SLAPI_LOG_TRACE, LINK_PLUGIN_SUBSYSTEM, + "<-- linked_attrs_get_sdn\n"); + + return sdn; }
/* @@ -1406,6 +1422,7 @@ linked_attrs_mod_backpointers(char *linkdn, char *type, { int perform_update = 0; const char *targetdn = slapi_value_get_string(targetval); + Slapi_DN *targetsdn = slapi_sdn_new_dn_byref(targetdn);
/* If we have a scope, only update the target if it is within * the scope. If we don't have a scope, only update the target @@ -1415,14 +1432,12 @@ linked_attrs_mod_backpointers(char *linkdn, char *type, } else { Slapi_Backend *be = NULL; Slapi_DN *linksdn = slapi_sdn_new_dn_byref(linkdn); - Slapi_DN *targetsdn = slapi_sdn_new_dn_byref(targetdn);
if ((be = slapi_be_select(linksdn))) { perform_update = slapi_sdn_issuffix(targetsdn, slapi_be_getsuffix(be, 0)); }
slapi_sdn_free(&linksdn); - slapi_sdn_free(&targetsdn); }
if (perform_update) { @@ -1432,13 +1447,14 @@ linked_attrs_mod_backpointers(char *linkdn, char *type, linkdn, targetdn);
/* Perform the modify operation. */ - slapi_modify_internal_set_pb(mod_pb, targetdn, mods, 0, 0, - linked_attrs_get_plugin_id(), 0); + slapi_modify_internal_set_pb_ext(mod_pb, targetsdn, mods, 0, 0, + linked_attrs_get_plugin_id(), 0); slapi_modify_internal_pb(mod_pb);
/* Initialize the pblock so we can reuse it. */ slapi_pblock_init(mod_pb); } + slapi_sdn_free(&targetsdn);
i = slapi_valueset_next_value(targetvals, i, &targetval); } @@ -1488,10 +1504,10 @@ linked_attrs_pre_op(Slapi_PBlock * pb, int modop) } else { /* Fetch the entry being modified so we can * create the resulting entry for validation. */ - Slapi_DN *tmp_dn = slapi_sdn_new_dn_byref(dn); + /* int free_sdn = 0; */ + Slapi_DN *tmp_dn = linked_attrs_get_sdn(pb); if (tmp_dn) { slapi_search_internal_get_entry(tmp_dn, 0, &e, linked_attrs_get_plugin_id()); - slapi_sdn_free(&tmp_dn); free_entry = 1; }
diff --git a/ldap/servers/plugins/linkedattrs/linked_attrs.h b/ldap/servers/plugins/linkedattrs/linked_attrs.h index c6e6347..8dfb4f0 100644 --- a/ldap/servers/plugins/linkedattrs/linked_attrs.h +++ b/ldap/servers/plugins/linkedattrs/linked_attrs.h @@ -127,7 +127,7 @@ void linked_attrs_unlock(); */ void linked_attrs_set_plugin_id(void *pluginID); void *linked_attrs_get_plugin_id(); -void linked_attrs_set_plugin_dn(char *pluginDN); +void linked_attrs_set_plugin_dn(const char *pluginDN); char *linked_attrs_get_plugin_dn();
/* diff --git a/ldap/servers/plugins/memberof/memberof.c b/ldap/servers/plugins/memberof/memberof.c index c2d87bb..9956dfe 100644 --- a/ldap/servers/plugins/memberof/memberof.c +++ b/ldap/servers/plugins/memberof/memberof.c @@ -494,8 +494,8 @@ int memberof_del_dn_type_callback(Slapi_Entry *e, void *callback_data) mod.mod_type = ((memberof_del_dn_data *)callback_data)->type; mod.mod_values = val;
- slapi_modify_internal_set_pb( - mod_pb, slapi_entry_get_dn(e), + slapi_modify_internal_set_pb_ext( + mod_pb, slapi_entry_get_sdn(e), mods, 0, 0, memberof_get_plugin_id(), 0);
@@ -752,8 +752,8 @@ int memberof_replace_dn_type_callback(Slapi_Entry *e, void *callback_data) addmod.mod_type = ((replace_dn_data *)callback_data)->type; addmod.mod_values = addval;
- slapi_modify_internal_set_pb( - mod_pb, slapi_entry_get_dn(e), + slapi_modify_internal_set_pb_ext( + mod_pb, slapi_entry_get_sdn(e), mods, 0, 0, memberof_get_plugin_id(), 0);
@@ -1051,11 +1051,13 @@ bail: */ char *memberof_getdn(Slapi_PBlock *pb) { - char *dn = 0; + const char *dn = 0; + Slapi_DN *sdn = NULL;
- slapi_pblock_get(pb, SLAPI_TARGET_DN, &dn); - - return dn; + slapi_pblock_get(pb, SLAPI_TARGET_SDN, &sdn); + dn = slapi_sdn_get_dn(sdn); + + return (char *)dn; }
/* @@ -2385,6 +2387,7 @@ int memberof_fix_memberof_callback(Slapi_Entry *e, void *callback_data) { int rc = 0; char *dn = slapi_entry_get_dn(e); + Slapi_DN *sdn = slapi_entry_get_sdn(e); struct fix_memberof_callback_data *cb_data = (struct fix_memberof_callback_data *)callback_data; MemberOfConfig *config = cb_data->config; memberof_del_dn_data del_data = {0, config->memberof_attr, cb_data->txn}; @@ -2420,8 +2423,8 @@ int memberof_fix_memberof_callback(Slapi_Entry *e, void *callback_data) mods[0] = slapi_mod_get_ldapmod_passout(smod); mods[1] = 0;
- slapi_modify_internal_set_pb( - mod_pb, dn, mods, 0, 0, + slapi_modify_internal_set_pb_ext( + mod_pb, sdn, mods, 0, 0, memberof_get_plugin_id(), 0);
slapi_pblock_set(mod_pb, SLAPI_TXN, cb_data->txn); diff --git a/ldap/servers/plugins/mep/mep.c b/ldap/servers/plugins/mep/mep.c index 0241cd3..237ef91 100644 --- a/ldap/servers/plugins/mep/mep.c +++ b/ldap/servers/plugins/mep/mep.c @@ -94,11 +94,11 @@ static void mep_free_config_entry(struct configEntry ** entry); /* * helpers */ -static char *mep_get_dn(Slapi_PBlock * pb); +static Slapi_DN *mep_get_sdn(Slapi_PBlock * pb); static Slapi_DN *mep_get_config_area(); static void mep_set_config_area(Slapi_DN *sdn); -static int mep_dn_is_config(char *dn); -static int mep_dn_is_template(char *dn); +static int mep_dn_is_config(Slapi_DN *sdn); +static int mep_dn_is_template(const char *dn); static void mep_find_config(Slapi_Entry *e, struct configEntry **config); static void mep_find_config_by_template_dn(const char *template_dn, struct configEntry **config); @@ -109,7 +109,7 @@ static Slapi_Entry *mep_create_managed_entry(struct configEntry *config, static void mep_add_managed_entry(struct configEntry *config, Slapi_Entry *origin); static void mep_rename_managed_entry(Slapi_Entry *origin, - char *new_dn, char *old_dn); + Slapi_DN *new_dn, Slapi_DN *old_dn); static Slapi_Mods *mep_get_mapped_mods(struct configEntry *config, Slapi_Entry *origin, char **mapped_dn); static int mep_parse_mapped_attr(char *mapping, Slapi_Entry *origin, @@ -289,7 +289,7 @@ mep_postop_init(Slapi_PBlock *pb) static int mep_start(Slapi_PBlock * pb) { - char *plugindn = NULL; + Slapi_DN *plugindn = NULL; char *config_area = NULL;
slapi_log_error(SLAPI_LOG_TRACE, MEP_PLUGIN_SUBSYSTEM, @@ -312,14 +312,14 @@ mep_start(Slapi_PBlock * pb) /* * Get the plug-in target dn from the system * and store it for future use. */ - slapi_pblock_get(pb, SLAPI_TARGET_DN, &plugindn); - if (NULL == plugindn || 0 == strlen(plugindn)) { + slapi_pblock_get(pb, SLAPI_TARGET_SDN, &plugindn); + if (NULL == plugindn || 0 == slapi_sdn_get_ndn_len(plugindn)) { slapi_log_error(SLAPI_LOG_PLUGIN, MEP_PLUGIN_SUBSYSTEM, "mep_start: unable to retrieve plugin dn\n"); return -1; }
- mep_set_plugin_sdn(slapi_sdn_new_dn_byref(plugindn)); + mep_set_plugin_sdn(slapi_sdn_dup(plugindn));
/* Set the alternate config area if one is defined. */ slapi_pblock_get(pb, SLAPI_PLUGIN_CONFIG_AREA, &config_area); @@ -434,8 +434,10 @@ mep_load_config() /* Find the config entries beneath our plugin entry. */ slapi_log_error(SLAPI_LOG_PLUGIN, MEP_PLUGIN_SUBSYSTEM, "mep_load_config: Looking for config entries " - "beneath "%s".\n", slapi_sdn_get_ndn(mep_get_plugin_sdn())); - slapi_search_internal_set_pb(search_pb, slapi_sdn_get_ndn(mep_get_plugin_sdn()), + "beneath "%s".\n", + slapi_sdn_get_ndn(mep_get_plugin_sdn())); + slapi_search_internal_set_pb(search_pb, + slapi_sdn_get_ndn(mep_get_plugin_sdn()), LDAP_SCOPE_SUBTREE, "objectclass=*", NULL, 0, NULL, NULL, mep_get_plugin_id(), 0); } @@ -769,24 +771,17 @@ mep_delete_config() /* * Helper functions */ -static char * -mep_get_dn(Slapi_PBlock * pb) +static Slapi_DN * +mep_get_sdn(Slapi_PBlock * pb) { - char *dn = 0; + Slapi_DN *sdn = 0; slapi_log_error(SLAPI_LOG_TRACE, MEP_PLUGIN_SUBSYSTEM, - "--> mep_get_dn\n"); - - if (slapi_pblock_get(pb, SLAPI_TARGET_DN, &dn)) { - slapi_log_error(SLAPI_LOG_FATAL, MEP_PLUGIN_SUBSYSTEM, - "mep_get_dn: failed to get dn of changed entry"); - goto bail; - } - - bail: + "--> mep_get_sdn\n"); + slapi_pblock_get(pb, SLAPI_TARGET_SDN, &sdn); slapi_log_error(SLAPI_LOG_TRACE, MEP_PLUGIN_SUBSYSTEM, - "<-- mep_get_dn\n"); + "<-- mep_get_sdn\n");
- return dn; + return sdn; }
static void @@ -807,20 +802,17 @@ mep_get_config_area() * Checks if dn is a managed entries config entry. */ static int -mep_dn_is_config(char *dn) +mep_dn_is_config(Slapi_DN *sdn) { int ret = 0; - Slapi_DN *sdn = NULL;
slapi_log_error(SLAPI_LOG_TRACE, MEP_PLUGIN_SUBSYSTEM, "--> mep_dn_is_config\n");
- if (dn == NULL) { + if (sdn == NULL) { goto bail; }
- sdn = slapi_sdn_new_dn_byref(dn); - /* If an alternate config area is configured, treat it's child * entries as config entries. If the alternate config area is * not configured, treat children of the top-level plug-in @@ -838,7 +830,6 @@ mep_dn_is_config(char *dn) }
bail: - slapi_sdn_free(&sdn); slapi_log_error(SLAPI_LOG_TRACE, MEP_PLUGIN_SUBSYSTEM, "<-- mep_dn_is_config\n");
@@ -851,7 +842,7 @@ bail: * Checks if dn is a managed entries template. */ static int -mep_dn_is_template(char *dn) +mep_dn_is_template(const char *dn) { int ret = 0; PRCList *list = NULL; @@ -1139,7 +1130,7 @@ mep_create_managed_entry(struct configEntry *config, Slapi_Entry *origin)
/* Create the DN using the mapped RDN value * and the base specified in the config. */ - dn = slapi_create_dn_string("%s=%s,%s", rdn_type, rdn_val, config->managed_base); + dn = slapi_ch_smprintf("%s=%s,%s", rdn_type, rdn_val, config->managed_base);
slapi_ch_free_string(&rdn_val);
@@ -1259,8 +1250,9 @@ mep_add_managed_entry(struct configEntry *config, slapi_log_error(SLAPI_LOG_PLUGIN, MEP_PLUGIN_SUBSYSTEM, "Adding %s pointer to "%s" in entry "%s"\n.", MEP_MANAGED_ENTRY_TYPE, managed_dn, slapi_entry_get_dn(origin)); - slapi_modify_internal_set_pb(mod_pb, slapi_entry_get_dn(origin), - mods, 0, 0, mep_get_plugin_id(), 0); + slapi_modify_internal_set_pb_ext(mod_pb, + slapi_entry_get_sdn(origin), + mods, 0, 0, mep_get_plugin_id(), 0); slapi_modify_internal_pb(mod_pb); slapi_pblock_get(mod_pb, SLAPI_PLUGIN_INTOP_RESULT, &result);
@@ -1283,8 +1275,9 @@ mep_add_managed_entry(struct configEntry *config, * Renames a managed entry and updates the pointer in the * origin entry. */ -static void mep_rename_managed_entry(Slapi_Entry *origin, - char *new_dn, char *old_dn) +static void +mep_rename_managed_entry(Slapi_Entry *origin, + Slapi_DN *new_dn, Slapi_DN *old_dn) { Slapi_RDN *srdn = slapi_rdn_new(); Slapi_PBlock *mep_pb = slapi_pblock_new(); @@ -1299,10 +1292,10 @@ static void mep_rename_managed_entry(Slapi_Entry *origin, }
/* Create new RDN */ - slapi_rdn_set_dn(srdn, new_dn); + slapi_rdn_set_dn(srdn, slapi_sdn_get_ndn(new_dn));
/* Rename the managed entry. */ - slapi_rename_internal_set_pb(mep_pb, old_dn, + slapi_rename_internal_set_pb_ext(mep_pb, old_dn, slapi_rdn_get_rdn(srdn), NULL, 1, NULL, NULL, mep_get_plugin_id(), 0); slapi_modrdn_internal_pb(mep_pb); @@ -1311,14 +1304,14 @@ static void mep_rename_managed_entry(Slapi_Entry *origin, if (result != LDAP_SUCCESS) { slapi_log_error(SLAPI_LOG_FATAL, MEP_PLUGIN_SUBSYSTEM, "mep_rename_managed_entry: Unable to rename managed " - "entry "%s" to "%s" (%s).\n", old_dn, - new_dn, ldap_err2string(result)); + "entry "%s" to "%s" (%s).\n", slapi_sdn_get_dn(old_dn), + slapi_sdn_get_dn(new_dn), ldap_err2string(result)); } else { /* Clear out the pblock for reuse. */ slapi_pblock_init(mep_pb);
/* Update the link to the managed entry in the origin entry. */ - vals[0] = new_dn; + vals[0] = (char *)slapi_sdn_get_dn(new_dn); vals[1] = 0; mod.mod_op = LDAP_MOD_REPLACE; mod.mod_type = MEP_MANAGED_ENTRY_TYPE; @@ -1331,8 +1324,8 @@ static void mep_rename_managed_entry(Slapi_Entry *origin, "mep_rename_managed_entry: Updating %s pointer to " ""%s" in entry "%s"\n.", MEP_MANAGED_ENTRY_TYPE, vals[0], slapi_entry_get_dn(origin)); - slapi_modify_internal_set_pb(mep_pb, slapi_entry_get_dn(origin), mods, - 0, 0, mep_get_plugin_id(), 0); + slapi_modify_internal_set_pb_ext(mep_pb, slapi_entry_get_sdn(origin), + mods, 0, 0, mep_get_plugin_id(), 0); slapi_modify_internal_pb(mep_pb); slapi_pblock_get(mep_pb, SLAPI_PLUGIN_INTOP_RESULT, &result);
@@ -1742,7 +1735,7 @@ mep_is_mapped_attr(Slapi_Entry *template, char *type) static int mep_pre_op(Slapi_PBlock * pb, int modop) { - char *dn = 0; + Slapi_DN *sdn = NULL; Slapi_Entry *e = 0; Slapi_Mods *smods = 0; LDAPMod **mods; @@ -1762,10 +1755,10 @@ mep_pre_op(Slapi_PBlock * pb, int modop) /* See if we're calling ourselves. */ slapi_pblock_get (pb, SLAPI_PLUGIN_IDENTITY, &caller_id);
- if (0 == (dn = mep_get_dn(pb))) + if (0 == (sdn = mep_get_sdn(pb))) goto bail;
- if (mep_dn_is_config(dn)) { + if (mep_dn_is_config(sdn)) { /* Validate config changes, but don't apply them. * This allows us to reject invalid config changes * here at the pre-op stage. Applying the config @@ -1777,10 +1770,8 @@ mep_pre_op(Slapi_PBlock * pb, int modop) } else if (LDAP_CHANGETYPE_MODIFY == modop) { /* Fetch the entry being modified so we can * create the resulting entry for validation. */ - Slapi_DN *tmp_dn = slapi_sdn_new_dn_byref(dn); - if (tmp_dn) { - slapi_search_internal_get_entry(tmp_dn, 0, &e, mep_get_plugin_id()); - slapi_sdn_free(&tmp_dn); + if (sdn) { + slapi_search_internal_get_entry(sdn, 0, &e, mep_get_plugin_id()); free_entry = 1; }
@@ -1829,11 +1820,10 @@ mep_pre_op(Slapi_PBlock * pb, int modop) goto bail; }
- mep_find_config_by_template_dn(dn, &config); + mep_find_config_by_template_dn(slapi_sdn_get_dn(sdn), &config); if (config) { Slapi_Entry *test_entry = NULL; struct configEntry *config_copy = NULL; - Slapi_DN *tmp_dn = NULL;
config_copy = (struct configEntry *)slapi_ch_calloc(1, sizeof(struct configEntry));
@@ -1860,12 +1850,9 @@ mep_pre_op(Slapi_PBlock * pb, int modop) ret = LDAP_UNWILLING_TO_PERFORM; break; case LDAP_CHANGETYPE_MODIFY: - tmp_dn = slapi_sdn_new_dn_byref(dn); - /* Fetch the existing template entry. */ - if (tmp_dn) { - slapi_search_internal_get_entry(tmp_dn, 0, &e, mep_get_plugin_id()); - slapi_sdn_free(&tmp_dn); + if (sdn) { + slapi_search_internal_get_entry(sdn, 0, &e, mep_get_plugin_id()); free_entry = 1; }
@@ -1920,7 +1907,6 @@ mep_pre_op(Slapi_PBlock * pb, int modop) * this plugin. */ if (((modop == LDAP_CHANGETYPE_DELETE) || (modop == LDAP_CHANGETYPE_MODDN) || (modop == LDAP_CHANGETYPE_MODIFY)) && (caller_id != mep_get_plugin_id())) { - Slapi_DN *tmp_dn = slapi_sdn_new_dn_byref(dn); Slapi_Entry *origin_e = NULL; Slapi_Mod *smod = NULL; Slapi_Mod *next_mod = NULL; @@ -1928,14 +1914,13 @@ mep_pre_op(Slapi_PBlock * pb, int modop) Slapi_DN *origin_sdn = NULL;
/* Fetch the target entry. */ - if (tmp_dn) { + if (sdn) { /* Free any existing entry so we don't leak it. */ if (e && free_entry) { slapi_entry_free(e); }
- slapi_search_internal_get_entry(tmp_dn, 0, &e, mep_get_plugin_id()); - slapi_sdn_free(&tmp_dn); + slapi_search_internal_get_entry(sdn, 0, &e, mep_get_plugin_id()); free_entry = 1; }
@@ -2070,7 +2055,7 @@ mep_mod_post_op(Slapi_PBlock *pb) Slapi_Mods *smods = NULL; Slapi_PBlock *mep_pb = NULL; Slapi_Entry *e = NULL; - char *dn = NULL; + Slapi_DN *sdn = NULL; char *managed_dn = NULL; Slapi_DN *managed_sdn = NULL; char *mapped_dn = NULL; @@ -2085,9 +2070,9 @@ mep_mod_post_op(Slapi_PBlock *pb) if (!g_plugin_started) return 0;
- if (mep_oktodo(pb) && (dn = mep_get_dn(pb))) { + if (mep_oktodo(pb) && (sdn = mep_get_sdn(pb))) { /* First check if the config or a template is being modified. */ - if (mep_dn_is_config(dn) || mep_dn_is_template(dn)) { + if (mep_dn_is_config(sdn) || mep_dn_is_template(slapi_sdn_get_dn(sdn))) { mep_load_config(); }
@@ -2143,7 +2128,7 @@ mep_mod_post_op(Slapi_PBlock *pb) slapi_log_error(SLAPI_LOG_FATAL, MEP_PLUGIN_SUBSYSTEM, "mep_mod_post_op: Unable to update mapped " "attributes from origin entry "%s" in managed " - "entry "%s" (%s).\n", dn, managed_dn, + "entry "%s" (%s).\n", slapi_sdn_get_dn(sdn), managed_dn, ldap_err2string(result)); }
@@ -2157,7 +2142,7 @@ mep_mod_post_op(Slapi_PBlock *pb) managed_sdn = slapi_sdn_new_dn_byref(managed_dn);
if (slapi_sdn_compare(managed_sdn, mapped_sdn) != 0) { - mep_rename_managed_entry(e, mapped_dn, managed_dn); + mep_rename_managed_entry(e, mapped_sdn, managed_sdn); }
slapi_sdn_free(&mapped_sdn); @@ -2166,7 +2151,7 @@ mep_mod_post_op(Slapi_PBlock *pb) } else { slapi_log_error(SLAPI_LOG_FATAL, MEP_PLUGIN_SUBSYSTEM, "mep_mod_post_op: Unable to find config for origin " - "entry "%s".\n", dn); + "entry "%s".\n", slapi_sdn_get_dn(sdn)); }
slapi_ch_free_string(&managed_dn); @@ -2187,7 +2172,7 @@ static int mep_add_post_op(Slapi_PBlock *pb) { Slapi_Entry *e = NULL; - char *dn = NULL; + Slapi_DN *sdn = NULL; struct configEntry *config = NULL;
slapi_log_error(SLAPI_LOG_TRACE, MEP_PLUGIN_SUBSYSTEM, @@ -2198,8 +2183,8 @@ mep_add_post_op(Slapi_PBlock *pb) return 0;
/* Reload config if a config entry was added. */ - if ((dn = mep_get_dn(pb))) { - if (mep_dn_is_config(dn)) { + if ((sdn = mep_get_sdn(pb))) { + if (mep_dn_is_config(sdn)) { mep_load_config(); } } else { @@ -2241,7 +2226,7 @@ mep_add_post_op(Slapi_PBlock *pb) } else { slapi_log_error(SLAPI_LOG_PLUGIN, MEP_PLUGIN_SUBSYSTEM, "mep_add_post_op: Error " - "retrieving post-op entry %s\n", dn); + "retrieving post-op entry %s\n", slapi_sdn_get_dn(sdn)); }
slapi_log_error(SLAPI_LOG_TRACE, MEP_PLUGIN_SUBSYSTEM, @@ -2253,8 +2238,8 @@ mep_add_post_op(Slapi_PBlock *pb) static int mep_del_post_op(Slapi_PBlock *pb) { - char *dn = NULL; Slapi_Entry *e = NULL; + Slapi_DN *sdn = NULL;
slapi_log_error(SLAPI_LOG_TRACE, MEP_PLUGIN_SUBSYSTEM, "--> mep_del_post_op\n"); @@ -2265,8 +2250,8 @@ mep_del_post_op(Slapi_PBlock *pb) }
/* Reload config if a config entry was deleted. */ - if ((dn = mep_get_dn(pb))) { - if (mep_dn_is_config(dn)) + if ((sdn = mep_get_sdn(pb))) { + if (mep_dn_is_config(sdn)) mep_load_config(); } else { slapi_log_error(SLAPI_LOG_PLUGIN, MEP_PLUGIN_SUBSYSTEM, @@ -2299,7 +2284,7 @@ mep_del_post_op(Slapi_PBlock *pb) slapi_log_error(SLAPI_LOG_PLUGIN, MEP_PLUGIN_SUBSYSTEM, "mep_del_post_op: Deleting managed entry " ""%s" due to deletion of origin entry " - ""%s".\n ", managed_dn, dn); + ""%s".\n ", managed_dn, slapi_sdn_get_dn(sdn)); slapi_delete_internal_set_pb(mep_pb, managed_dn, NULL, NULL, mep_get_plugin_id(), 0); slapi_delete_internal_pb(mep_pb); @@ -2310,7 +2295,7 @@ mep_del_post_op(Slapi_PBlock *pb) } else { slapi_log_error(SLAPI_LOG_PLUGIN, MEP_PLUGIN_SUBSYSTEM, "mep_del_post_op: Error " - "retrieving pre-op entry %s\n", dn); + "retrieving pre-op entry %s\n", slapi_sdn_get_dn(sdn)); }
slapi_log_error(SLAPI_LOG_TRACE, MEP_PLUGIN_SUBSYSTEM, @@ -2322,8 +2307,9 @@ mep_del_post_op(Slapi_PBlock *pb) static int mep_modrdn_post_op(Slapi_PBlock *pb) { - char *old_dn = NULL; - char *new_dn = NULL; + const char *new_dn = NULL; + Slapi_DN *old_sdn = NULL; + Slapi_DN *new_sdn = NULL; Slapi_Entry *post_e = NULL; char *managed_dn = NULL; struct configEntry *config = NULL; @@ -2340,7 +2326,8 @@ mep_modrdn_post_op(Slapi_PBlock *pb) * config entries. */ slapi_pblock_get(pb, SLAPI_ENTRY_POST_OP, &post_e); if (post_e) { - new_dn = slapi_entry_get_ndn(post_e); + new_sdn = slapi_entry_get_sdn(post_e); + new_dn = slapi_sdn_get_dn(new_sdn); } else { slapi_log_error(SLAPI_LOG_PLUGIN, MEP_PLUGIN_SUBSYSTEM, "mep_modrdn_post_op: Error " @@ -2348,8 +2335,8 @@ mep_modrdn_post_op(Slapi_PBlock *pb) return 0; }
- if ((old_dn = mep_get_dn(pb))) { - if (mep_dn_is_config(old_dn) || mep_dn_is_config(new_dn)) + if ((old_sdn = mep_get_sdn(pb))) { + if (mep_dn_is_config(old_sdn) || mep_dn_is_config(new_sdn)) mep_load_config(); } else { slapi_log_error(SLAPI_LOG_PLUGIN, MEP_PLUGIN_SUBSYSTEM, @@ -2398,7 +2385,7 @@ mep_modrdn_post_op(Slapi_PBlock *pb) slapi_log_error(SLAPI_LOG_PLUGIN, MEP_PLUGIN_SUBSYSTEM, "mep_modrdn_post_op: Removing managed entry "%s" " "since origin entry "%s" was moved out of scope.\n", - managed_dn, old_dn); + managed_dn, slapi_sdn_get_dn(old_sdn)); slapi_delete_internal_set_pb (mep_pb, managed_dn, NULL, NULL, mep_get_plugin_id(), 0); slapi_delete_internal_pb(mep_pb); @@ -2428,8 +2415,8 @@ mep_modrdn_post_op(Slapi_PBlock *pb) "mep_modrdn_post_op: Removing %s pointer and %s " "objectclass from entry "%s".\n", MEP_MANAGED_ENTRY_TYPE, MEP_ORIGIN_OC, new_dn); - slapi_modify_internal_set_pb(mep_pb, new_dn, mods, 0, 0, - mep_get_plugin_id(), 0); + slapi_modify_internal_set_pb_ext(mep_pb, new_sdn, mods, 0, 0, + mep_get_plugin_id(), 0); slapi_modify_internal_pb(mep_pb); slapi_pblock_get(mep_pb, SLAPI_PLUGIN_INTOP_RESULT, &result);
@@ -2442,7 +2429,7 @@ mep_modrdn_post_op(Slapi_PBlock *pb) } } else { /* Update backlink to new origin DN in managed entry. */ - vals[0] = new_dn; + vals[0] = (char *)new_dn; vals[1] = 0; mod.mod_op = LDAP_MOD_REPLACE; mod.mod_type = MEP_MANAGED_BY_TYPE; @@ -2498,8 +2485,11 @@ mep_modrdn_post_op(Slapi_PBlock *pb) "mep_modrdn_post_op: Renaming managed entry " ""%s" to "%s" due to rename of origin " "entry "%s".\n ", managed_dn, - slapi_entry_get_dn(new_managed_entry), old_dn); - mep_rename_managed_entry(post_e, slapi_entry_get_dn(new_managed_entry), managed_dn); + slapi_entry_get_dn(new_managed_entry), + slapi_sdn_get_dn(old_sdn)); + mep_rename_managed_entry(post_e, + slapi_entry_get_sdn(new_managed_entry), + managed_sdn); }
/* Update all of the mapped attributes @@ -2513,7 +2503,8 @@ mep_modrdn_post_op(Slapi_PBlock *pb) slapi_log_error(SLAPI_LOG_PLUGIN, MEP_PLUGIN_SUBSYSTEM, "mep_modrdn_post_op: Updating mapped attributes " "in entry "%s"\n.", managed_dn); - slapi_modify_internal_set_pb(mep_pb, slapi_entry_get_dn(new_managed_entry), + slapi_modify_internal_set_pb_ext(mep_pb, + slapi_entry_get_sdn(new_managed_entry), slapi_mods_get_ldapmods_byref(smods), 0, 0, mep_get_plugin_id(), 0); slapi_modify_internal_pb(mep_pb); diff --git a/ldap/servers/plugins/pam_passthru/pam_passthru.h b/ldap/servers/plugins/pam_passthru/pam_passthru.h index 6a9d332..748c2f1 100644 --- a/ldap/servers/plugins/pam_passthru/pam_passthru.h +++ b/ldap/servers/plugins/pam_passthru/pam_passthru.h @@ -129,7 +129,7 @@ void * pam_passthruauth_get_plugin_identity(); */ int pam_passthru_config( Slapi_Entry *config_e ); Pam_PassthruConfig *pam_passthru_get_config( void ); -int pam_passthru_check_suffix(Pam_PassthruConfig *cfg, char *binddn); +int pam_passthru_check_suffix(Pam_PassthruConfig *cfg, const char *binddn);
/* * pam_ptimpl.c diff --git a/ldap/servers/plugins/pam_passthru/pam_ptconfig.c b/ldap/servers/plugins/pam_passthru/pam_ptconfig.c index beff65d..bde2ef6 100644 --- a/ldap/servers/plugins/pam_passthru/pam_ptconfig.c +++ b/ldap/servers/plugins/pam_passthru/pam_ptconfig.c @@ -538,7 +538,7 @@ pam_passthru_apply_config (Slapi_PBlock *pb, Slapi_Entry* entryBefore, Slapi_Ent }
int -pam_passthru_check_suffix(Pam_PassthruConfig *cfg, char *binddn) +pam_passthru_check_suffix(Pam_PassthruConfig *cfg, const char *binddn) { Slapi_DN *comp_dn; Pam_PassthruSuffix *try; diff --git a/ldap/servers/plugins/pam_passthru/pam_ptimpl.c b/ldap/servers/plugins/pam_passthru/pam_ptimpl.c index 662239f..2aedec7 100644 --- a/ldap/servers/plugins/pam_passthru/pam_ptimpl.c +++ b/ldap/servers/plugins/pam_passthru/pam_ptimpl.c @@ -91,7 +91,7 @@ struct my_pam_conv_str { * Get the PAM identity from the value of the leftmost RDN in the BIND DN. */ static char * -derive_from_bind_dn(Slapi_PBlock *pb, char *binddn, MyStrBuf *pam_id) +derive_from_bind_dn(Slapi_PBlock *pb, const char *binddn, MyStrBuf *pam_id) { Slapi_RDN *rdn; char *type = NULL; @@ -106,7 +106,8 @@ derive_from_bind_dn(Slapi_PBlock *pb, char *binddn, MyStrBuf *pam_id) }
static char * -derive_from_bind_entry(Slapi_PBlock *pb, char *binddn, MyStrBuf *pam_id, char *map_ident_attr, int *locked) +derive_from_bind_entry(Slapi_PBlock *pb, const char *binddn, + MyStrBuf *pam_id, char *map_ident_attr, int *locked) { char buf[BUFSIZ]; Slapi_Entry *entry = NULL; @@ -264,7 +265,8 @@ do_one_pam_auth( ) { MyStrBuf pam_id; - char *binddn = NULL; + const char *binddn = NULL; + Slapi_DN *bindsdn = NULL; int rc; int retcode = LDAP_SUCCESS; pam_handle_t *pam_handle; @@ -274,7 +276,13 @@ do_one_pam_auth( char *errmsg = NULL; /* free with PR_smprintf_free */ int locked = 0;
- slapi_pblock_get( pb, SLAPI_BIND_TARGET, &binddn ); + slapi_pblock_get( pb, SLAPI_BIND_TARGET_SDN, &bindsdn ); + if (NULL == bindsdn) { + errmsg = PR_smprintf("Null bind dn"); + retcode = LDAP_OPERATIONS_ERROR; + goto done; /* skip the pam stuff */ + } + binddn = slapi_sdn_get_dn(bindsdn);
if (method == PAMPT_MAP_METHOD_RDN) { derive_from_bind_dn(pb, binddn, &pam_id); diff --git a/ldap/servers/plugins/pam_passthru/pam_ptpreop.c b/ldap/servers/plugins/pam_passthru/pam_ptpreop.c index 9e14c26..d726017 100644 --- a/ldap/servers/plugins/pam_passthru/pam_ptpreop.c +++ b/ldap/servers/plugins/pam_passthru/pam_ptpreop.c @@ -165,10 +165,12 @@ static int pam_passthru_bindpreop( Slapi_PBlock *pb ) { int rc, method; - char *normbinddn, *errmsg = NULL; + const char *normbinddn; + char *errmsg = NULL; + Slapi_DN *bindsdn = NULL; Pam_PassthruConfig *cfg; struct berval *creds; - int retcode = PAM_PASSTHRU_OP_NOT_HANDLED; + int retcode = PAM_PASSTHRU_OP_NOT_HANDLED;
PAM_PASSTHRU_ASSERT( pb != NULL );
@@ -179,12 +181,13 @@ pam_passthru_bindpreop( Slapi_PBlock *pb ) * retrieve parameters for bind operation */ if ( slapi_pblock_get( pb, SLAPI_BIND_METHOD, &method ) != 0 || - slapi_pblock_get( pb, SLAPI_BIND_TARGET, &normbinddn ) != 0 || + slapi_pblock_get( pb, SLAPI_BIND_TARGET_SDN, &bindsdn ) != 0 || slapi_pblock_get( pb, SLAPI_BIND_CREDENTIALS, &creds ) != 0 ) { slapi_log_error( SLAPI_LOG_FATAL, PAM_PASSTHRU_PLUGIN_SUBSYSTEM, "<= not handled (unable to retrieve bind parameters)\n" ); return retcode; } + normbinddn = slapi_sdn_get_dn(bindsdn);
/* * We only handle simple bind requests that include non-NULL binddn and diff --git a/ldap/servers/plugins/passthru/passthru.h b/ldap/servers/plugins/passthru/passthru.h index ac19849..e0421ac 100644 --- a/ldap/servers/plugins/passthru/passthru.h +++ b/ldap/servers/plugins/passthru/passthru.h @@ -136,7 +136,7 @@ typedef struct passthruconfig { * ptbind.c: */ int passthru_simple_bind_s( Slapi_PBlock *pb, PassThruServer *srvr, int tries, - char *dn, struct berval *creds, LDAPControl **reqctrls, int *lderrnop, + const char *dn, struct berval *creds, LDAPControl **reqctrls, int *lderrnop, char **matcheddnp, char **errmsgp, struct berval ***refurlsp, LDAPControl ***resctrlsp );
@@ -149,7 +149,7 @@ PassThruConfig *passthru_get_config( void ); /* * ptconn.c: */ -int passthru_dn2server( PassThruConfig *cfg, char *normdn, +int passthru_dn2server( PassThruConfig *cfg, const char *normdn, PassThruServer **srvrp ); int passthru_get_connection( PassThruServer *srvr, LDAP **ldp ); void passthru_release_connection( PassThruServer *srvr, LDAP *ld, int dispose ); diff --git a/ldap/servers/plugins/passthru/ptbind.c b/ldap/servers/plugins/passthru/ptbind.c index 063ba15..efbc896 100644 --- a/ldap/servers/plugins/passthru/ptbind.c +++ b/ldap/servers/plugins/passthru/ptbind.c @@ -48,7 +48,7 @@ #include "passthru.h"
static int -passthru_simple_bind_once_s( PassThruServer *srvr, char *dn, +passthru_simple_bind_once_s( PassThruServer *srvr, const char *dn, struct berval *creds, LDAPControl **reqctrls, int *lderrnop, char **matcheddnp, char **errmsgp, struct berval ***refurlsp, LDAPControl ***resctrlsp ); @@ -68,7 +68,7 @@ passthru_simple_bind_once_s( PassThruServer *srvr, char *dn, */ int passthru_simple_bind_s( Slapi_PBlock *pb, PassThruServer *srvr, int tries, - char *dn, struct berval *creds, LDAPControl **reqctrls, int *lderrnop, + const char *dn, struct berval *creds, LDAPControl **reqctrls, int *lderrnop, char **matcheddnp, char **errmsgp, struct berval ***refurlsp, LDAPControl ***resctrlsp ) { @@ -102,7 +102,7 @@ passthru_simple_bind_s( Slapi_PBlock *pb, PassThruServer *srvr, int tries, * like passthru_simple_bind_s() but only makes one attempt. */ static int -passthru_simple_bind_once_s( PassThruServer *srvr, char *dn, +passthru_simple_bind_once_s( PassThruServer *srvr, const char *dn, struct berval *creds, LDAPControl **reqctrls, int *lderrnop, char **matcheddnp, char **errmsgp, struct berval ***refurlsp, LDAPControl ***resctrlsp ) diff --git a/ldap/servers/plugins/passthru/ptconn.c b/ldap/servers/plugins/passthru/ptconn.c index 1001c98..a3e2bd2 100644 --- a/ldap/servers/plugins/passthru/ptconn.c +++ b/ldap/servers/plugins/passthru/ptconn.c @@ -50,7 +50,7 @@ /* * function prototypes */ -static int dn_is_underneath_suffix( PassThruSuffix *suffix, char *normdn, +static int dn_is_underneath_suffix( PassThruSuffix *suffix, const char *normdn, int dnlen ); static void close_and_dispose_connection( PassThruConnection *conn ); static void check_for_stale_connections( PassThruServer *srvr ); @@ -107,7 +107,7 @@ static void check_for_stale_connections( PassThruServer *srvr ); * LDAP_NO_SUCH_OBJECT let this server handle the bind. */ int -passthru_dn2server( PassThruConfig *cfg, char *normdn, PassThruServer **srvrp ) +passthru_dn2server( PassThruConfig *cfg, const char *normdn, PassThruServer **srvrp ) { PassThruServer *ptsrvr; PassThruSuffix *ptsuffix; @@ -360,7 +360,7 @@ passthru_close_all_connections( PassThruConfig *cfg ) * return non-zero value if normdn falls underneath a suffix */ static int -dn_is_underneath_suffix( PassThruSuffix *suffix, char *normdn, int dnlen ) +dn_is_underneath_suffix( PassThruSuffix *suffix, const char *normdn, int dnlen ) { PASSTHRU_ASSERT( suffix != NULL ); PASSTHRU_ASSERT( normdn != NULL ); @@ -368,7 +368,7 @@ dn_is_underneath_suffix( PassThruSuffix *suffix, char *normdn, int dnlen )
return ( suffix->ptsuffix_len <= dnlen && slapi_UTF8CASECMP( suffix->ptsuffix_normsuffix, - normdn + ( dnlen - suffix->ptsuffix_len )) == 0 ); + (char *)normdn + ( dnlen - suffix->ptsuffix_len )) == 0 ); }
diff --git a/ldap/servers/plugins/passthru/ptpreop.c b/ldap/servers/plugins/passthru/ptpreop.c index e566c64..1f73cf1 100644 --- a/ldap/servers/plugins/passthru/ptpreop.c +++ b/ldap/servers/plugins/passthru/ptpreop.c @@ -149,7 +149,9 @@ static int passthru_bindpreop( Slapi_PBlock *pb ) { int rc, method, freeresctrls=1; - char *normbinddn, *matcheddn; + char *matcheddn; + const char *normbinddn = NULL; + Slapi_DN *sdn = NULL; char *libldap_errmsg, *pr_errmsg, *errmsg; PassThruConfig *cfg; PassThruServer *srvr; @@ -165,14 +167,15 @@ passthru_bindpreop( Slapi_PBlock *pb ) * retrieve parameters for bind operation */ if ( slapi_pblock_get( pb, SLAPI_BIND_METHOD, &method ) != 0 || - slapi_pblock_get( pb, SLAPI_BIND_TARGET, &normbinddn ) != 0 || - slapi_pblock_get( pb, SLAPI_BIND_CREDENTIALS, &creds ) != 0 ) { - slapi_log_error( SLAPI_LOG_FATAL, PASSTHRU_PLUGIN_SUBSYSTEM, - "<= not handled (unable to retrieve bind parameters)\n" ); - return( PASSTHRU_OP_NOT_HANDLED ); + slapi_pblock_get( pb, SLAPI_BIND_TARGET_SDN, &sdn ) != 0 || + slapi_pblock_get( pb, SLAPI_BIND_CREDENTIALS, &creds ) != 0 ) { + slapi_log_error( SLAPI_LOG_FATAL, PASSTHRU_PLUGIN_SUBSYSTEM, + "<= not handled (unable to retrieve bind parameters)\n" ); + return( PASSTHRU_OP_NOT_HANDLED ); } + normbinddn = slapi_sdn_get_dn(sdn); if ( normbinddn == NULL ) { - normbinddn = ""; + normbinddn = ""; }
/* diff --git a/ldap/servers/plugins/referint/referint.c b/ldap/servers/plugins/referint/referint.c index 8b3ac75..57ee6df 100644 --- a/ldap/servers/plugins/referint/referint.c +++ b/ldap/servers/plugins/referint/referint.c @@ -77,10 +77,10 @@ int referint_postop_del( Slapi_PBlock *pb ); int referint_postop_modrdn( Slapi_PBlock *pb ); int referint_postop_start( Slapi_PBlock *pb); int referint_postop_close( Slapi_PBlock *pb); -int update_integrity(char **argv, char *origDN, char *newrDN, char *newsuperior, int logChanges, void *txn); +int update_integrity(char **argv, Slapi_DN *sDN, char *newrDN, Slapi_DN *newsuperior, int logChanges, void *txn); void referint_thread_func(void *arg); int GetNextLine(char *dest, int size_dest, PRFileDesc *stream); -void writeintegritylog(char *logfilename, char *dn, char *newrdn, char *newsuperior); +void writeintegritylog(char *logfilename, Slapi_DN *sdn, char *newrdn, Slapi_DN *newsuperior); int my_fgetc(PRFileDesc *stream);
/* global thread control stuff */ @@ -157,7 +157,7 @@ referint_postop_init( Slapi_PBlock *pb ) int referint_postop_del( Slapi_PBlock *pb ) { - char *dn; + Slapi_DN *sdn = NULL; int rc; int oprc; char **argv; @@ -168,7 +168,7 @@ referint_postop_del( Slapi_PBlock *pb ) void *txn = NULL;
if ( slapi_pblock_get( pb, SLAPI_IS_REPLICATED_OPERATION, &isrepop ) != 0 || - slapi_pblock_get( pb, SLAPI_DELETE_TARGET, &dn ) != 0 || + slapi_pblock_get( pb, SLAPI_DELETE_TARGET_SDN, &sdn ) != 0 || slapi_pblock_get(pb, SLAPI_PLUGIN_OPRETURN, &oprc) != 0 || slapi_pblock_get(pb, SLAPI_TXN, &txn) != 0) { @@ -215,10 +215,10 @@ referint_postop_del( Slapi_PBlock *pb ) }else if(delay == 0){ /* no delay */ /* call function to update references to entry */ - rc = update_integrity(argv, dn, NULL, NULL, logChanges, txn); + rc = update_integrity(argv, sdn, NULL, NULL, logChanges, txn); }else{ /* write the entry to integrity log */ - writeintegritylog(argv[1],dn, NULL, NULL); + writeintegritylog(argv[1], sdn, NULL, NULL); rc = 0; } } else { @@ -234,9 +234,9 @@ referint_postop_del( Slapi_PBlock *pb ) int referint_postop_modrdn( Slapi_PBlock *pb ) { - char *dn; + Slapi_DN *sdn = NULL; char *newrdn; - char *newsuperior; + Slapi_DN *newsuperior; int oprc; int rc; char **argv; @@ -247,9 +247,9 @@ referint_postop_modrdn( Slapi_PBlock *pb ) void *txn = NULL;
if ( slapi_pblock_get( pb, SLAPI_IS_REPLICATED_OPERATION, &isrepop ) != 0 || - slapi_pblock_get( pb, SLAPI_MODRDN_TARGET, &dn ) != 0 || + slapi_pblock_get( pb, SLAPI_MODRDN_TARGET_SDN, &sdn ) != 0 || slapi_pblock_get( pb, SLAPI_MODRDN_NEWRDN, &newrdn ) != 0 || - slapi_pblock_get( pb, SLAPI_MODRDN_NEWSUPERIOR, &newsuperior ) != 0 || + slapi_pblock_get( pb, SLAPI_MODRDN_NEWSUPERIOR_SDN, &newsuperior ) != 0 || slapi_pblock_get(pb, SLAPI_PLUGIN_OPRETURN, &oprc) != 0 || slapi_pblock_get(pb, SLAPI_TXN, &txn) != 0) {
@@ -299,11 +299,12 @@ referint_postop_modrdn( Slapi_PBlock *pb ) rc = 0; }else if(delay == 0){ /* no delay */ - /* call function to update references to entry */ - rc = update_integrity(argv, dn, newrdn, newsuperior, logChanges, txn); + /* call function to update references to entry */ + rc = update_integrity(argv, sdn, newrdn, + newsuperior, logChanges, txn); }else{ /* write the entry to integrity log */ - writeintegritylog(argv[1],dn, newrdn, newsuperior); + writeintegritylog(argv[1], sdn, newrdn, newsuperior); rc = 0; }
@@ -331,7 +332,7 @@ int isFatalSearchError(int search_result) }
static int -_do_modify(Slapi_PBlock *mod_pb, const char *entryDN, LDAPMod **mods, void *txn) +_do_modify(Slapi_PBlock *mod_pb, Slapi_DN *entrySDN, LDAPMod **mods, void *txn) { int rc = 0;
@@ -340,8 +341,8 @@ _do_modify(Slapi_PBlock *mod_pb, const char *entryDN, LDAPMod **mods, void *txn) slapi_pblock_set(mod_pb, SLAPI_TXN, txn);
/* Use internal operation API */ - slapi_modify_internal_set_pb(mod_pb, entryDN, mods, NULL, NULL, - referint_plugin_identity, 0); + slapi_modify_internal_set_pb_ext(mod_pb, entrySDN, mods, NULL, NULL, + referint_plugin_identity, 0); slapi_modify_internal_pb(mod_pb); slapi_pblock_get(mod_pb, SLAPI_PLUGIN_INTOP_RESULT, &rc);
@@ -352,13 +353,12 @@ _do_modify(Slapi_PBlock *mod_pb, const char *entryDN, LDAPMod **mods, void *txn) * update one attribute value per _do_modify */ static int -_update_one_per_mod(const char *entryDN, /* DN of the searched entry */ - Slapi_Attr *attr, /* referred attribute */ +_update_one_per_mod(Slapi_DN *entrySDN, /* DN of the searched entry */ + Slapi_Attr *attr, /* referred attribute */ char *attrName, - char *origDN, /* original DN that was modified */ - char *norm_origDN, /* normalized original DN */ - char *newRDN, /* new RDN from modrdn */ - char *newsuperior, /* new superior from modrdn */ + const char *origDN, /* original DN that was modified */ + char *newRDN, /* new RDN from modrdn */ + const char *newsuperior, /* new superior from modrdn */ Slapi_PBlock *mod_pb, void *txn) { LDAPMod *list_of_mods[3]; @@ -374,7 +374,7 @@ _update_one_per_mod(const char *entryDN, /* DN of the searched entry */ if (NULL == newRDN && NULL == newsuperior) { /* in delete mode */ /* delete old dn so set that up */ - values_del[0] = origDN; + values_del[0] = (char *)origDN; values_del[1] = NULL; attribute1.mod_type = attrName; attribute1.mod_op = LDAP_MOD_DELETE; @@ -382,11 +382,11 @@ _update_one_per_mod(const char *entryDN, /* DN of the searched entry */ list_of_mods[0] = &attribute1; /* terminate list of mods. */ list_of_mods[1] = NULL; - rc = _do_modify(mod_pb, entryDN, list_of_mods, txn); + rc = _do_modify(mod_pb, entrySDN, list_of_mods, txn); if (rc) { slapi_log_error( SLAPI_LOG_FATAL, REFERINT_PLUGIN_SUBSYSTEM, "_update_one_value: entry %s: deleting "%s: %s" failed (%d)" - "\n", entryDN, attrName, origDN, rc); + "\n", slapi_sdn_get_dn(entrySDN), attrName, origDN, rc); } } else { /* in modrdn mode */ @@ -400,7 +400,7 @@ _update_one_per_mod(const char *entryDN, /* DN of the searched entry */ newRDN = dnParts[0]; } if (newsuperior) { - superior = (const char *)newsuperior; + superior = newsuperior; } else { /* no need to free superior */ superior = slapi_dn_find_parent(origDN); @@ -443,7 +443,7 @@ _update_one_per_mod(const char *entryDN, /* DN of the searched entry */ } /* else: (rc < 0) Ignore the DN normalization error for now. */
- p = PL_strstr(sval, norm_origDN); + p = PL_strstr(sval, origDN); if (p == sval) { /* (case 1) */ values_del[0] = sval; @@ -460,12 +460,13 @@ _update_one_per_mod(const char *entryDN, /* DN of the searched entry */ attribute2.mod_values = values_add; list_of_mods[1] = &attribute2; list_of_mods[2] = NULL; - rc = _do_modify(mod_pb, entryDN, list_of_mods, txn); + rc = _do_modify(mod_pb, entrySDN, list_of_mods, txn); if (rc) { slapi_log_error( SLAPI_LOG_FATAL, REFERINT_PLUGIN_SUBSYSTEM, "_update_one_value: entry %s: replacing "%s: %s" " "with "%s: %s" failed (%d)\n", - entryDN, attrName, origDN, attrName, newDN, rc); + slapi_sdn_get_dn(entrySDN), attrName, + origDN, attrName, newDN, rc); } } else if (p) { char bak; @@ -489,12 +490,12 @@ _update_one_per_mod(const char *entryDN, /* DN of the searched entry */ attribute2.mod_values = values_add; list_of_mods[1] = &attribute2; list_of_mods[2] = NULL; - rc = _do_modify(mod_pb, entryDN, list_of_mods, txn); + rc = _do_modify(mod_pb, entrySDN, list_of_mods, txn); if (rc) { slapi_log_error( SLAPI_LOG_FATAL, REFERINT_PLUGIN_SUBSYSTEM, "_update_one_value: entry %s: replacing "%s: %s" " "with "%s: %s" failed (%d)\n", - entryDN, attrName, sval, attrName, newvalue, rc); + slapi_sdn_get_dn(entrySDN), attrName, sval, attrName, newvalue, rc); } slapi_ch_free_string(&newvalue); } @@ -517,13 +518,12 @@ _update_one_per_mod(const char *entryDN, /* DN of the searched entry */ * update multiple attribute values per _do_modify */ static int -_update_all_per_mod(const char *entryDN, /* DN of the searched entry */ - Slapi_Attr *attr, /* referred attribute */ +_update_all_per_mod(Slapi_DN *entrySDN, /* DN of the searched entry */ + Slapi_Attr *attr, /* referred attribute */ char *attrName, - char *origDN, /* original DN that was modified */ - char *norm_origDN, /* normalized original DN */ - char *newRDN, /* new RDN from modrdn */ - char *newsuperior, /* new superior from modrdn */ + const char *origDN, /* original DN that was modified */ + char *newRDN, /* new RDN from modrdn */ + const char *newsuperior, /* new superior from modrdn */ Slapi_PBlock *mod_pb, void *txn) { Slapi_Mods *smods = NULL; @@ -543,7 +543,7 @@ _update_all_per_mod(const char *entryDN, /* DN of the searched entry */ LDAPMod attribute1;
/* delete old dn so set that up */ - values_del[0] = origDN; + values_del[0] = (char *)origDN; values_del[1] = NULL; attribute1.mod_type = attrName; attribute1.mod_op = LDAP_MOD_DELETE; @@ -551,11 +551,11 @@ _update_all_per_mod(const char *entryDN, /* DN of the searched entry */ mods[0] = &attribute1; /* terminate list of mods. */ mods[1] = NULL; - rc = _do_modify(mod_pb, entryDN, mods, txn); + rc = _do_modify(mod_pb, entrySDN, mods, txn); if (rc) { slapi_log_error( SLAPI_LOG_FATAL, REFERINT_PLUGIN_SUBSYSTEM, "_update_one_value: entry %s: deleting "%s: %s" failed (%d)" - "\n", entryDN, attrName, origDN, rc); + "\n", slapi_sdn_get_dn(entrySDN), attrName, origDN, rc); } } else { /* in modrdn mode */ @@ -569,7 +569,7 @@ _update_all_per_mod(const char *entryDN, /* DN of the searched entry */ newRDN = dnParts[0]; } if (newsuperior) { - superior = (const char *)newsuperior; + superior = newsuperior; } else { /* no need to free superior */ superior = slapi_dn_find_parent(origDN); @@ -615,7 +615,7 @@ _update_all_per_mod(const char *entryDN, /* DN of the searched entry */ } /* else: (rc < 0) Ignore the DN normalization error for now. */
- p = PL_strstr(sval, norm_origDN); + p = PL_strstr(sval, origDN); if (p == sval) { /* (case 1) */ slapi_mods_add_string(smods, LDAP_MOD_DELETE, attrName, sval); @@ -632,11 +632,11 @@ _update_all_per_mod(const char *entryDN, /* DN of the searched entry */ /* else: value does not include the modified DN. Ignore it. */ slapi_ch_free_string(&sval); } - rc = _do_modify(mod_pb, entryDN, slapi_mods_get_ldapmods_byref(smods), txn); + rc = _do_modify(mod_pb, entrySDN, slapi_mods_get_ldapmods_byref(smods), txn); if (rc) { slapi_log_error( SLAPI_LOG_FATAL, REFERINT_PLUGIN_SUBSYSTEM, "_update_all_value: entry %s failed (%d)\n", - entryDN, rc); + slapi_sdn_get_dn(entrySDN), rc); }
/* cleanup memory allocated for dnParts and newDN */ @@ -652,8 +652,9 @@ _update_all_per_mod(const char *entryDN, /* DN of the searched entry */ }
int -update_integrity(char **argv, char *origDN, - char *newrDN, char *newsuperior, int logChanges, void *txn) +update_integrity(char **argv, Slapi_DN *origSDN, + char *newrDN, Slapi_DN *newsuperior, + int logChanges, void *txn) { Slapi_PBlock *search_result_pb = NULL; Slapi_PBlock *mod_pb = slapi_pblock_new(); @@ -664,9 +665,9 @@ update_integrity(char **argv, char *origDN, char *filter = NULL; int i, j; const char *search_base = NULL; - char *norm_origDN = NULL; - size_t dnlen = 0; int rc; + size_t len = slapi_sdn_get_ndn_len(origSDN); + const char *origDN = slapi_sdn_get_dn(origSDN);
if ( argv == NULL ) { slapi_log_error( SLAPI_LOG_FATAL, REFERINT_PLUGIN_SUBSYSTEM, @@ -677,16 +678,6 @@ update_integrity(char **argv, char *origDN,
/* for now, just putting attributes to keep integrity on in conf file, until resolve the other timing mode issue */ - - rc = slapi_dn_normalize_case_ext(origDN, 0, &norm_origDN, &dnlen); - if (rc == 0) { /* origDN is passed in; not terminated */ - *(norm_origDN + dnlen) = '\0'; - norm_origDN = slapi_ch_strdup(norm_origDN); - } else if (rc < 0) { - /* Ignore the DN normalization error for now. */ - norm_origDN = slapi_ch_strdup(origDN); - } - search_result_pb = slapi_pblock_new();
/* Search each namingContext in turn */ @@ -698,8 +689,8 @@ update_integrity(char **argv, char *origDN, for(i = 3; argv[i] != NULL; i++) { char buf[BUFSIZ]; - size_t len = strlen(origDN); - filter = slapi_ch_smprintf("(%s=*%s)", argv[i], escape_filter_value(origDN, len, buf)); + filter = slapi_ch_smprintf("(%s=*%s)", argv[i], + escape_filter_value(origDN, len, buf)); if ( filter ) { /* Need only the current attribute and its subtypes */ char *attrs[2]; @@ -758,18 +749,16 @@ update_integrity(char **argv, char *origDN, */ if (nval > 128) { rc = _update_one_per_mod( - slapi_entry_get_dn(search_entries[j]), - attr, attrName, - origDN, norm_origDN, - newrDN, newsuperior, - mod_pb, txn); + slapi_entry_get_sdn(search_entries[j]), + attr, attrName, origDN, newrDN, + slapi_sdn_get_dn(newsuperior), + mod_pb, txn); } else { rc = _update_all_per_mod( - slapi_entry_get_dn(search_entries[j]), - attr, attrName, - origDN, norm_origDN, - newrDN, newsuperior, - mod_pb, txn); + slapi_entry_get_sdn(search_entries[j]), + attr, attrName, origDN, newrDN, + slapi_sdn_get_dn(newsuperior), + mod_pb, txn); } /* Should we stop if one modify returns an error? */ } @@ -798,8 +787,6 @@ update_integrity(char **argv, char *origDN, rc = 0;
free_and_return: - slapi_ch_free_string(&norm_origDN); - /* free filter and search_results_pb */ slapi_ch_free_string(&filter);
@@ -900,7 +887,9 @@ referint_thread_func(void *arg) int no_changes; char delimiter[]="\t\n"; char *ptoken; - char *tmpdn, *tmprdn, *tmpsuperior; + Slapi_DN *sdn = NULL; + char *tmprdn; + Slapi_DN *tmpsuperior = NULL; int logChanges=0; char * iter = NULL;
@@ -960,8 +949,7 @@ referint_thread_func(void *arg)
while( GetNextLine(thisline, MAX_LINE, prfd) ){ ptoken = ldap_utf8strtok_r(thisline, delimiter, &iter); - tmpdn = slapi_ch_calloc(strlen(ptoken) + 1, sizeof(char)); - strcpy(tmpdn, ptoken); + sdn = slapi_sdn_new_dn_byref(ptoken);
ptoken = ldap_utf8strtok_r (NULL, delimiter, &iter); if(!strcasecmp(ptoken, "NULL")) { @@ -974,14 +962,15 @@ referint_thread_func(void *arg) if (!strcasecmp(ptoken, "NULL")) { tmpsuperior = NULL; } else { - tmpsuperior = slapi_ch_smprintf("%s", ptoken); + tmpsuperior = slapi_sdn_new_dn_byref(ptoken); }
- update_integrity(plugin_argv, tmpdn, tmprdn, tmpsuperior, logChanges, NULL); + update_integrity(plugin_argv, sdn, tmprdn, + tmpsuperior, logChanges, NULL);
- slapi_ch_free_string(&tmpdn); + slapi_sdn_free(&sdn); slapi_ch_free_string(&tmprdn); - slapi_ch_free_string(&tmpsuperior); + slapi_sdn_free(&tmpsuperior); }
PR_Close(prfd); @@ -1094,7 +1083,8 @@ GetNextLine(char *dest, int size_dest, PRFileDesc *stream) { }
void -writeintegritylog(char *logfilename, char *dn, char *newrdn, char *newsuperior) +writeintegritylog(char *logfilename, Slapi_DN *sdn, + char *newrdn, Slapi_DN *newsuperior) { PRFileDesc *prfd; char buffer[MAX_LINE]; @@ -1123,7 +1113,7 @@ writeintegritylog(char *logfilename, char *dn, char *newrdn, char *newsuperior) */
/* add length of dn + 4(two tabs, a newline, and terminating \0) */ - len_to_write = strlen(dn) + 4; + len_to_write = slapi_sdn_get_ndn_len(sdn) + 4;
if(newrdn == NULL) { @@ -1139,7 +1129,7 @@ writeintegritylog(char *logfilename, char *dn, char *newrdn, char *newsuperior) len_to_write += 4; }else{ /* add the length of the newsuperior */ - len_to_write += strlen(newsuperior); + len_to_write += slapi_sdn_get_ndn_len(newsuperior); }
if(len_to_write > MAX_LINE ) @@ -1150,9 +1140,10 @@ writeintegritylog(char *logfilename, char *dn, char *newrdn, char *newsuperior) " to update references to this entry.\n"); }else{ PR_snprintf(buffer, MAX_LINE, "%s\t%s\t%s\t\n", - dn, + slapi_sdn_get_dn(sdn), (newrdn != NULL) ? newrdn : "NULL", - (newsuperior != NULL) ? newsuperior : "NULL"); + (newsuperior != NULL) ? slapi_sdn_get_dn(newsuperior) : + "NULL"); if (PR_Write(prfd,buffer,strlen(buffer)) < 0){ slapi_log_error(SLAPI_LOG_FATAL,REFERINT_PLUGIN_SUBSYSTEM, " writeintegritylog: PR_Write failed : The disk" diff --git a/ldap/servers/plugins/replication/cl4_api.c b/ldap/servers/plugins/replication/cl4_api.c index c7d0ce0..ab72793 100644 --- a/ldap/servers/plugins/replication/cl4_api.c +++ b/ldap/servers/plugins/replication/cl4_api.c @@ -533,7 +533,7 @@ static int _cl4ResolveTargetDN (Slapi_Entry *entry, Slapi_DN **newTargetDN) if (strcasecmp (changetype, "add") == 0) /* this is add operation - we have rawdn */ slapi_sdn_set_dn_byref (targetSDN, targetdn); else - slapi_sdn_set_ndn_byref (targetSDN, targetdn); + slapi_sdn_set_normdn_byref (targetSDN, targetdn);
/* read the entry to which the change was applied */ rc = _cl4GetTargetEntry (targetSDN, uniqueid, &targetEntry); diff --git a/ldap/servers/plugins/replication/cl5_api.c b/ldap/servers/plugins/replication/cl5_api.c index c360444..2a834d7 100644 --- a/ldap/servers/plugins/replication/cl5_api.c +++ b/ldap/servers/plugins/replication/cl5_api.c @@ -1060,7 +1060,7 @@ cl5ImportLDIF (const char *clDir, const char *ldifFile, Object **replicas) "cl5ImportLDIF: " "failed to write operation to the changelog: " "type: %lu, dn: %s\n", - op.operation_type, op.target_address.dn); + op.operation_type, REPL_GET_DN(&op.target_address)); slapi_ch_free_string(&replGen); operation_parameters_done (&op); goto done; @@ -1080,7 +1080,7 @@ cl5ImportLDIF (const char *clDir, const char *ldifFile, Object **replicas) "cl5ImportLDIF: " "failed to write operation to the changelog: " "type: %lu, dn: %s\n", - op.operation_type, op.target_address.dn); + op.operation_type, REPL_GET_DN(&op.target_address)); object_release (replica_obj); slapi_ch_free_string(&replGen); operation_parameters_done (&op); @@ -2150,7 +2150,7 @@ static int _cl5Entry2DBData (const CL5Entry *entry, char **data, PRUint32 *len) } break;
- case SLAPI_OPERATION_MODIFY: size += strlen (op->target_address.dn) + 1; + case SLAPI_OPERATION_MODIFY: size += REPL_GET_DN_LEN(&op->target_address) + 1; /* Need larger buffer for the encrypted changelog */ if (s_cl5Desc.clcrypt_handle) { size += (_cl5GetModsSize (op->p.p_modify.modify_mods) * (1 + BACK_CRYPT_OUTBUFF_EXTLEN)); @@ -2159,11 +2159,11 @@ static int _cl5Entry2DBData (const CL5Entry *entry, char **data, PRUint32 *len) } break;
- case SLAPI_OPERATION_MODRDN: size += strlen (op->target_address.dn) + 1; + case SLAPI_OPERATION_MODRDN: size += REPL_GET_DN_LEN(&op->target_address) + 1; /* 1 for deleteoldrdn */ size += strlen (op->p.p_modrdn.modrdn_newrdn) + 2; - if (op->p.p_modrdn.modrdn_newsuperior_address.dn) - size += strlen (op->p.p_modrdn.modrdn_newsuperior_address.dn) + 1; + if (REPL_GET_DN(&op->p.p_modrdn.modrdn_newsuperior_address)) + size += REPL_GET_DN_LEN(&op->p.p_modrdn.modrdn_newsuperior_address) + 1; else size ++; /* for NULL char */ if (op->p.p_modrdn.modrdn_newsuperior_address.uniqueid) @@ -2178,7 +2178,7 @@ static int _cl5Entry2DBData (const CL5Entry *entry, char **data, PRUint32 *len) } break;
- case SLAPI_OPERATION_DELETE: size += strlen (op->target_address.dn) + 1; + case SLAPI_OPERATION_DELETE: size += REPL_GET_DN_LEN(&op->target_address) + 1; break; }
@@ -2218,20 +2218,20 @@ static int _cl5Entry2DBData (const CL5Entry *entry, char **data, PRUint32 *len) ldap_mods_free (add_mods, 1); break;
- case SLAPI_OPERATION_MODIFY: _cl5WriteString (op->target_address.dn, &pos); + case SLAPI_OPERATION_MODIFY: _cl5WriteString (REPL_GET_DN(&op->target_address), &pos); _cl5WriteMods (op->p.p_modify.modify_mods, &pos); break;
- case SLAPI_OPERATION_MODRDN: _cl5WriteString (op->target_address.dn, &pos); + case SLAPI_OPERATION_MODRDN: _cl5WriteString (REPL_GET_DN(&op->target_address), &pos); _cl5WriteString (op->p.p_modrdn.modrdn_newrdn, &pos); *pos = (PRUint8)op->p.p_modrdn.modrdn_deloldrdn; pos ++; - _cl5WriteString (op->p.p_modrdn.modrdn_newsuperior_address.dn, &pos); + _cl5WriteString (REPL_GET_DN(&op->p.p_modrdn.modrdn_newsuperior_address), &pos); _cl5WriteString (op->p.p_modrdn.modrdn_newsuperior_address.uniqueid, &pos); _cl5WriteMods (op->p.p_modrdn.modrdn_mods, &pos); break;
- case SLAPI_OPERATION_DELETE: _cl5WriteString (op->target_address.dn, &pos); + case SLAPI_OPERATION_DELETE: _cl5WriteString (REPL_GET_DN(&op->target_address), &pos); break; } @@ -2319,27 +2319,31 @@ cl5DBData2Entry (const char *data, PRUint32 len, CL5Entry *entry) case SLAPI_OPERATION_ADD: _cl5ReadString (&op->p.p_add.parentuniqueid, &pos); /* richm: need to free parentuniqueid */ _cl5ReadString (&rawDN, &pos); - op->target_address.dn = rawDN; + op->target_address.sdn = slapi_sdn_new_dn_passin(rawDN); /* convert mods to entry */ rc = _cl5ReadMods (&add_mods, &pos); slapi_mods2entry (&(op->p.p_add.target_entry), rawDN, add_mods); ldap_mods_free (add_mods, 1); break;
- case SLAPI_OPERATION_MODIFY: _cl5ReadString (&op->target_address.dn, &pos); + case SLAPI_OPERATION_MODIFY: _cl5ReadString (&rawDN, &pos); + op->target_address.sdn = slapi_sdn_new_dn_passin(rawDN); rc = _cl5ReadMods (&op->p.p_modify.modify_mods, &pos); break;
- case SLAPI_OPERATION_MODRDN: _cl5ReadString (&op->target_address.dn, &pos); + case SLAPI_OPERATION_MODRDN: _cl5ReadString (&rawDN, &pos); + op->target_address.sdn = slapi_sdn_new_dn_passin(rawDN); _cl5ReadString (&op->p.p_modrdn.modrdn_newrdn, &pos); op->p.p_modrdn.modrdn_deloldrdn = *pos; pos ++; - _cl5ReadString (&op->p.p_modrdn.modrdn_newsuperior_address.dn, &pos); + _cl5ReadString (&rawDN, &pos); + op->p.p_modrdn.modrdn_newsuperior_address.sdn = slapi_sdn_new_dn_passin(rawDN); _cl5ReadString (&op->p.p_modrdn.modrdn_newsuperior_address.uniqueid, &pos); rc = _cl5ReadMods (&op->p.p_modrdn.modrdn_mods, &pos); break;
- case SLAPI_OPERATION_DELETE: _cl5ReadString (&op->target_address.dn, &pos); + case SLAPI_OPERATION_DELETE: _cl5ReadString (&rawDN, &pos); + op->target_address.sdn = slapi_sdn_new_dn_passin(rawDN); rc = CL5_SUCCESS; break;
@@ -4210,7 +4214,7 @@ static int _cl5Operation2LDIF (const slapi_operation_parameters *op, const char "_cl5Operation2LDIF(MODIFY): mods are NULL\n"); return CL5_BAD_FORMAT; } - len += LDIF_SIZE_NEEDED(strlen (T_DNSTR), strlen (op->target_address.dn)); + len += LDIF_SIZE_NEEDED(strlen (T_DNSTR), REPL_GET_DN_LEN(&op->target_address)); l = make_changes_string(op->p.p_modify.modify_mods, NULL); len += LDIF_SIZE_NEEDED(strlen (T_CHANGESTR), l->ls_len); break; @@ -4220,15 +4224,15 @@ static int _cl5Operation2LDIF (const slapi_operation_parameters *op, const char "_cl5Operation2LDIF(MODRDN): mods are NULL\n"); return CL5_BAD_FORMAT; } - len += LDIF_SIZE_NEEDED(strlen (T_DNSTR), strlen (op->target_address.dn)); + len += LDIF_SIZE_NEEDED(strlen (T_DNSTR), REPL_GET_DN_LEN(&op->target_address)); len += LDIF_SIZE_NEEDED(strlen (T_NEWRDNSTR), strlen (op->p.p_modrdn.modrdn_newrdn)); strDeleteOldRDN = (op->p.p_modrdn.modrdn_deloldrdn ? "true" : "false"); len += LDIF_SIZE_NEEDED(strlen (T_DRDNFLAGSTR), strlen (strDeleteOldRDN)); - if (op->p.p_modrdn.modrdn_newsuperior_address.dn) + if (REPL_GET_DN(&op->p.p_modrdn.modrdn_newsuperior_address)) len += LDIF_SIZE_NEEDED(strlen (T_NEWSUPERIORDNSTR), - strlen (op->p.p_modrdn.modrdn_newsuperior_address.dn)); + REPL_GET_DN_LEN(&op->p.p_modrdn.modrdn_newsuperior_address)); if (op->p.p_modrdn.modrdn_newsuperior_address.uniqueid) len += LDIF_SIZE_NEEDED(strlen (T_NEWSUPERIORIDSTR), strlen (op->p.p_modrdn.modrdn_newsuperior_address.uniqueid)); @@ -4236,12 +4240,12 @@ static int _cl5Operation2LDIF (const slapi_operation_parameters *op, const char len += LDIF_SIZE_NEEDED(strlen (T_CHANGESTR), l->ls_len); break;
- case SLAPI_OPERATION_DELETE: if (NULL == op->target_address.dn) { + case SLAPI_OPERATION_DELETE: if (NULL == REPL_GET_DN(&op->target_address)) { slapi_log_error(SLAPI_LOG_FATAL, repl_plugin_name_cl, "_cl5Operation2LDIF(DELETE): target dn is NULL\n"); return CL5_BAD_FORMAT; } - len += LDIF_SIZE_NEEDED(strlen (T_DNSTR), strlen (op->target_address.dn)); + len += LDIF_SIZE_NEEDED(strlen (T_DNSTR), REPL_GET_DN_LEN(&op->target_address)); break; default: slapi_log_error(SLAPI_LOG_FATAL, repl_plugin_name_cl, @@ -4277,21 +4281,21 @@ static int _cl5Operation2LDIF (const slapi_operation_parameters *op, const char slapi_ch_free ((void**)&rawDN); break;
- case SLAPI_OPERATION_MODIFY: slapi_ldif_put_type_and_value_with_options(&buff, T_DNSTR, op->target_address.dn, - strlen (op->target_address.dn), 0); + case SLAPI_OPERATION_MODIFY: slapi_ldif_put_type_and_value_with_options(&buff, T_DNSTR, REPL_GET_DN(&op->target_address), + REPL_GET_DN_LEN(&op->target_address), 0); slapi_ldif_put_type_and_value_with_options(&buff, T_CHANGESTR, l->ls_buf, l->ls_len, 0); break;
- case SLAPI_OPERATION_MODRDN: slapi_ldif_put_type_and_value_with_options(&buff, T_DNSTR, op->target_address.dn, - strlen (op->target_address.dn), 0); + case SLAPI_OPERATION_MODRDN: slapi_ldif_put_type_and_value_with_options(&buff, T_DNSTR, REPL_GET_DN(&op->target_address), + REPL_GET_DN_LEN(&op->target_address), 0); slapi_ldif_put_type_and_value_with_options(&buff, T_NEWRDNSTR, op->p.p_modrdn.modrdn_newrdn, strlen (op->p.p_modrdn.modrdn_newrdn), 0); slapi_ldif_put_type_and_value_with_options(&buff, T_DRDNFLAGSTR, strDeleteOldRDN, strlen (strDeleteOldRDN), 0); - if (op->p.p_modrdn.modrdn_newsuperior_address.dn) + if (REPL_GET_DN(&op->p.p_modrdn.modrdn_newsuperior_address)) slapi_ldif_put_type_and_value_with_options(&buff, T_NEWSUPERIORDNSTR, - op->p.p_modrdn.modrdn_newsuperior_address.dn, - strlen (op->p.p_modrdn.modrdn_newsuperior_address.dn), 0); + REPL_GET_DN(&op->p.p_modrdn.modrdn_newsuperior_address), + REPL_GET_DN_LEN(&op->p.p_modrdn.modrdn_newsuperior_address), 0); if (op->p.p_modrdn.modrdn_newsuperior_address.uniqueid) slapi_ldif_put_type_and_value_with_options(&buff, T_NEWSUPERIORIDSTR, op->p.p_modrdn.modrdn_newsuperior_address.uniqueid, @@ -4299,8 +4303,8 @@ static int _cl5Operation2LDIF (const slapi_operation_parameters *op, const char slapi_ldif_put_type_and_value_with_options(&buff, T_CHANGESTR, l->ls_buf, l->ls_len, 0); break;
- case SLAPI_OPERATION_DELETE: slapi_ldif_put_type_and_value_with_options(&buff, T_DNSTR, op->target_address.dn, - strlen (op->target_address.dn), 0); + case SLAPI_OPERATION_DELETE: slapi_ldif_put_type_and_value_with_options(&buff, T_DNSTR, REPL_GET_DN(&op->target_address), + REPL_GET_DN_LEN(&op->target_address), 0); break; }
@@ -4377,10 +4381,10 @@ _cl5LDIF2Operation (char *ldifEntry, slapi_operation_parameters *op, char **repl if (op->operation_type == SLAPI_OPERATION_ADD) { rawDN = slapi_ch_strdup (value.bv_val); - op->target_address.dn = slapi_ch_strdup(rawDN); + op->target_address.sdn = slapi_sdn_new_dn_byval(rawDN); } else - op->target_address.dn = slapi_ch_strdup (value.bv_val); + op->target_address.sdn = slapi_sdn_new_dn_byval(value.bv_val); } else if (strncasecmp (type.bv_val, T_PARENTIDSTR, type.bv_len) == 0) { @@ -4396,7 +4400,7 @@ _cl5LDIF2Operation (char *ldifEntry, slapi_operation_parameters *op, char **repl } else if (strncasecmp (type.bv_val, T_NEWSUPERIORDNSTR, type.bv_len) == 0) { - op->p.p_modrdn.modrdn_newsuperior_address.dn = slapi_ch_strdup (value.bv_val); + op->p.p_modrdn.modrdn_newsuperior_address.sdn = slapi_sdn_new_dn_byval(value.bv_val); } else if (strncasecmp (type.bv_val, T_NEWSUPERIORIDSTR, type.bv_len) == 0) { @@ -4507,7 +4511,7 @@ static int _cl5WriteOperationTxn(const char *replName, const char *replGen, { slapi_log_error(SLAPI_LOG_REPL, repl_plugin_name_cl, "_cl5WriteOperationTxn: failed to get db file for target dn (%s)", - op->target_address.dn); + REPL_GET_DN(&op->target_address)); return CL5_OBJSET_ERROR; }
@@ -4907,7 +4911,7 @@ static int _cl5GetOperation (Object *replica, slapi_operation_parameters *op)
case DB_NOTFOUND: slapi_log_error(SLAPI_LOG_REPL, repl_plugin_name_cl, "_cl5GetOperation: operation for csn (%s) is not found in db that should contain dn (%s)\n", - csnStr, op->target_address.dn); + csnStr, REPL_GET_DN(&op->target_address)); rc = CL5_NOTFOUND; goto done;
@@ -6151,7 +6155,7 @@ static Object* _cl5GetReplica (const slapi_operation_parameters *op, const char*
PR_ASSERT (op && replGen);
- sdn = slapi_sdn_new_dn_byref(op->target_address.dn); + sdn = op->target_address.sdn;
replObj = replica_get_replica_from_dn (sdn); if (replObj) @@ -6169,8 +6173,6 @@ static Object* _cl5GetReplica (const slapi_operation_parameters *op, const char*
slapi_ch_free ((void**)&newGen); } - - slapi_sdn_free (&sdn);
return replObj; } diff --git a/ldap/servers/plugins/replication/cl5_test.c b/ldap/servers/plugins/replication/cl5_test.c index 91cdef2..4bb83a7 100644 --- a/ldap/servers/plugins/replication/cl5_test.c +++ b/ldap/servers/plugins/replication/cl5_test.c @@ -838,7 +838,7 @@ static int populateChangelogOp () pb = slapi_pblock_new (); cur_time = time (NULL); PR_snprintf (newrdn, sizeof(newrdn), "cn=renamed%s", ctime(&cur_time)); - slapi_rename_internal_set_pb (pb, dn, newrdn, NULL, 1, NULL, NULL, + slapi_rename_internal_set_pb_ext (pb, dn, newrdn, NULL, 1, NULL, NULL, repl_get_plugin_identity (PLUGIN_MULTIMASTER_REPLICATION), 0); slapi_modrdn_internal_pb (pb); slapi_pblock_get(pb, SLAPI_PLUGIN_INTOP_RESULT, &rc); diff --git a/ldap/servers/plugins/replication/legacy_consumer.c b/ldap/servers/plugins/replication/legacy_consumer.c index a65c5e6..2440ce7 100644 --- a/ldap/servers/plugins/replication/legacy_consumer.c +++ b/ldap/servers/plugins/replication/legacy_consumer.c @@ -96,13 +96,14 @@ Slapi_RWLock *legacy_consumer_config_lock = NULL; static PRBool target_is_a_replica_root(Slapi_PBlock *pb, const Slapi_DN **root) { - char *dn; - Slapi_DN *sdn; - PRBool return_value; + Slapi_DN *sdn = NULL; + PRBool return_value = PR_FALSE; Object *repl_obj;
- slapi_pblock_get(pb, SLAPI_TARGET_DN, &dn); - sdn = slapi_sdn_new_dn_byref(dn); + slapi_pblock_get(pb, SLAPI_TARGET_SDN, &sdn); + if (NULL == sdn) { + return return_value; + } repl_obj = replica_get_replica_from_dn(sdn); if (NULL != repl_obj) { @@ -116,7 +117,6 @@ target_is_a_replica_root(Slapi_PBlock *pb, const Slapi_DN **root) *root = NULL; return_value = PR_FALSE; } - slapi_sdn_free(&sdn); return return_value; }
@@ -492,7 +492,7 @@ legacy_consumer_read_config ()
int -legacy_consumer_is_replicationdn(char *dn) +legacy_consumer_is_replicationdn(const char *dn) { int return_value = 0; /* Assume not */
diff --git a/ldap/servers/plugins/replication/repl.h b/ldap/servers/plugins/replication/repl.h index ca0fe05..433be34 100644 --- a/ldap/servers/plugins/replication/repl.h +++ b/ldap/servers/plugins/replication/repl.h @@ -405,7 +405,7 @@ int modrdn2reple( Slapi_Entry *e, char *newrdn, int deloldrdn, LDAPMod **ldm );
/* In legacy_consumer.c */ void process_legacy_cf(Slapi_PBlock *pb); -int legacy_consumer_is_replicationdn(char *dn); +int legacy_consumer_is_replicationdn(const char *dn); int legacy_consumer_is_replicationpw(struct berval *creds); int legacy_consumer_config_init();
diff --git a/ldap/servers/plugins/replication/repl5.h b/ldap/servers/plugins/replication/repl5.h index 79465e4..ac2cd88 100644 --- a/ldap/servers/plugins/replication/repl5.h +++ b/ldap/servers/plugins/replication/repl5.h @@ -134,6 +134,9 @@ #define MAX_NUM_OF_MASTERS 64 #define REPL_SESSION_ID_SIZE 64
+#define REPL_GET_DN(addrp) slapi_sdn_get_dn((addrp)->sdn) +#define REPL_GET_DN_LEN(addrp) slapi_sdn_get_ndn_len((addrp)->sdn) + /* Attribute names for replication agreement attributes */ extern const char *type_nsds5ReplicaHost; extern const char *type_nsds5ReplicaPort; diff --git a/ldap/servers/plugins/replication/repl5_agmt.c b/ldap/servers/plugins/replication/repl5_agmt.c index 61aa9ba..f1f114b 100644 --- a/ldap/servers/plugins/replication/repl5_agmt.c +++ b/ldap/servers/plugins/replication/repl5_agmt.c @@ -1729,8 +1729,7 @@ agmt_notify_change(Repl_Agmt *agmt, Slapi_PBlock *pb) if (NULL != pb) { /* Is the entry within our replicated area? */ - char *target_dn; - Slapi_DN *target_sdn; + Slapi_DN *target_sdn = NULL; int change_is_relevant = 0;
PR_ASSERT(NULL != agmt); @@ -1741,8 +1740,11 @@ agmt_notify_change(Repl_Agmt *agmt, Slapi_PBlock *pb) return; }
- slapi_pblock_get(pb, SLAPI_TARGET_DN, &target_dn); - target_sdn = slapi_sdn_new_dn_byref(target_dn); /* XXX see if you can avoid allocating this */ + slapi_pblock_get(pb, SLAPI_TARGET_SDN, &target_sdn); + if (NULL == target_sdn) { + PR_Unlock(agmt->lock); + return; + }
if (slapi_sdn_issuffix(target_sdn, agmt->replarea)) { @@ -1799,7 +1801,6 @@ agmt_notify_change(Repl_Agmt *agmt, Slapi_PBlock *pb) } } PR_Unlock(agmt->lock); - slapi_sdn_free(&target_sdn); if (change_is_relevant) { /* Notify the protocol that a change has occurred */ @@ -1856,7 +1857,7 @@ agmt_replica_init_done (const Repl_Agmt *agmt) mod.mod_type = (char*)type_nsds5ReplicaInitialize; mod.mod_bvalues = NULL; - slapi_modify_internal_set_pb(pb, slapi_sdn_get_dn (agmt->dn), mods, NULL/* controls */, + slapi_modify_internal_set_pb_ext(pb, agmt->dn, mods, NULL/* controls */, NULL/* uniqueid */, repl_get_plugin_identity (PLUGIN_MULTIMASTER_REPLICATION), 0/* flags */); slapi_modify_internal_pb (pb);
@@ -1949,7 +1950,7 @@ agmt_update_consumer_ruv (Repl_Agmt *ra) mods[1] = (LDAPMod *)slapi_mod_get_ldapmod_byref(&smod_last_modified); mods[2] = NULL;
- slapi_modify_internal_set_pb (pb, (char*)slapi_sdn_get_dn(ra->dn), mods, NULL, NULL, + slapi_modify_internal_set_pb_ext (pb, ra->dn, mods, NULL, NULL, repl_get_plugin_identity(PLUGIN_MULTIMASTER_REPLICATION), 0); slapi_modify_internal_pb (pb);
diff --git a/ldap/servers/plugins/replication/repl5_agmtlist.c b/ldap/servers/plugins/replication/repl5_agmtlist.c index 8cc2cc3..8a98c21 100644 --- a/ldap/servers/plugins/replication/repl5_agmtlist.c +++ b/ldap/servers/plugins/replication/repl5_agmtlist.c @@ -184,10 +184,10 @@ agmtlist_add_callback(Slapi_PBlock *pb, Slapi_Entry *e, Slapi_Entry *entryAfter,
rc = add_new_agreement(e); if (0 != rc) { - char *dn; - slapi_pblock_get(pb, SLAPI_TARGET_DN, &dn); + Slapi_DN *sdn = NULL; + slapi_pblock_get(pb, SLAPI_TARGET_SDN, &sdn); slapi_log_error(SLAPI_LOG_FATAL, repl_plugin_name, "agmtlist_add_callback: " - "Can't start agreement "%s"\n", dn); + "Can't start agreement "%s"\n", slapi_sdn_get_dn(sdn)); *returncode = LDAP_UNWILLING_TO_PERFORM; return SLAPI_DSE_CALLBACK_ERROR; } @@ -200,7 +200,6 @@ agmtlist_modify_callback(Slapi_PBlock *pb, Slapi_Entry *entryBefore, Slapi_Entry int *returncode, char *returntext, void *arg) { int i; - char *dn; Slapi_DN *sdn = NULL; int start_initialize = 0, stop_initialize = 0, cancel_initialize = 0; int update_the_schedule = 0; /* do we need to update the repl sched? */ @@ -224,13 +223,18 @@ agmtlist_modify_callback(Slapi_PBlock *pb, Slapi_Entry *entryBefore, Slapi_Entry goto done; }
- slapi_pblock_get(pb, SLAPI_TARGET_DN, &dn); - sdn= slapi_sdn_new_dn_byref(dn); + slapi_pblock_get(pb, SLAPI_TARGET_SDN, &sdn); + if (NULL == sdn) { + slapi_log_error(SLAPI_LOG_FATAL, repl_plugin_name, + "agmtlist_modify_callback: NULL target dn\n"); + goto done; + } agmt = agmtlist_get_by_agmt_name(sdn); if (NULL == agmt) { slapi_log_error(SLAPI_LOG_FATAL, repl_plugin_name, "agmtlist_modify_callback: received " - "a modification for unknown replication agreement "%s"\n", dn); + "a modification for unknown replication agreement "%s"\n", + slapi_sdn_get_dn(sdn)); goto done; }
@@ -277,7 +281,7 @@ agmtlist_modify_callback(Slapi_PBlock *pb, Slapi_Entry *entryBefore, Slapi_Entry
if (strcasecmp (val, "start") == 0) { - start_initialize = 1; + start_initialize = 1; } else if (strcasecmp (val, "stop") == 0) { @@ -528,8 +532,6 @@ done: agmtlist_release_agmt(agmt); }
- if (sdn) - slapi_sdn_free(&sdn); return rc; }
diff --git a/ldap/servers/plugins/replication/repl5_inc_protocol.c b/ldap/servers/plugins/replication/repl5_inc_protocol.c index 0e05973..274a069 100644 --- a/ldap/servers/plugins/replication/repl5_inc_protocol.c +++ b/ldap/servers/plugins/replication/repl5_inc_protocol.c @@ -1423,7 +1423,7 @@ replay_update(Private_Repl_Protocol *prp, slapi_operation_parameters *op, int *m slapi_log_error(SLAPI_LOG_REPL, repl_plugin_name, "%s: replay_update: Sending %s operation (dn="%s" csn=%s)\n", agmt_get_long_name(prp->agmt), - op2string(op->operation_type), op->target_address.dn, csn_str); + op2string(op->operation_type), REPL_GET_DN(&op->target_address), csn_str); /* What type of operation is it? */ switch (op->operation_type) { @@ -1448,7 +1448,7 @@ replay_update(Private_Repl_Protocol *prp, slapi_operation_parameters *op, int *m { repl5_strip_fractional_mods(prp->agmt,entryattrs); } - return_value = conn_send_add(prp->conn, op->target_address.dn, + return_value = conn_send_add(prp->conn, REPL_GET_DN(&op->target_address), entryattrs, update_control, message_id); ldap_mods_free(entryattrs, 1); } @@ -1460,18 +1460,18 @@ replay_update(Private_Repl_Protocol *prp, slapi_operation_parameters *op, int *m { repl5_strip_fractional_mods(prp->agmt,op->p.p_modify.modify_mods); } - return_value = conn_send_modify(prp->conn, op->target_address.dn, + return_value = conn_send_modify(prp->conn, REPL_GET_DN(&op->target_address), op->p.p_modify.modify_mods, update_control, message_id); break; case SLAPI_OPERATION_DELETE: - return_value = conn_send_delete(prp->conn, op->target_address.dn, + return_value = conn_send_delete(prp->conn, REPL_GET_DN(&op->target_address), update_control, message_id); break; case SLAPI_OPERATION_MODRDN: /* XXXggood need to pass modrdn mods in update control! */ - return_value = conn_send_rename(prp->conn, op->target_address.dn, + return_value = conn_send_rename(prp->conn, REPL_GET_DN(&op->target_address), op->p.p_modrdn.modrdn_newrdn, - op->p.p_modrdn.modrdn_newsuperior_address.dn, + REPL_GET_DN(&op->p.p_modrdn.modrdn_newsuperior_address), op->p.p_modrdn.modrdn_deloldrdn, update_control, message_id); break; diff --git a/ldap/servers/plugins/replication/repl5_init.c b/ldap/servers/plugins/replication/repl5_init.c index 883c3e6..4e2464c 100644 --- a/ldap/servers/plugins/replication/repl5_init.c +++ b/ldap/servers/plugins/replication/repl5_init.c @@ -338,8 +338,8 @@ multimaster_betxnpostop_init( Slapi_PBlock *pb ) slapi_pblock_set( pb, SLAPI_PLUGIN_DESCRIPTION, (void *)&multimasterbetxnpostopdesc ) != 0 || slapi_pblock_set( pb, SLAPI_PLUGIN_BE_TXN_POST_MODRDN_FN, (void *) multimaster_betxnpostop_modrdn ) != 0 || slapi_pblock_set( pb, SLAPI_PLUGIN_BE_TXN_POST_DELETE_FN, (void *) multimaster_betxnpostop_delete ) != 0 || - slapi_pblock_set( pb, SLAPI_PLUGIN_BE_TXN_POST_ADD_FN, (void *) multimaster_betxnpostop_modrdn ) != 0 || - slapi_pblock_set( pb, SLAPI_PLUGIN_BE_TXN_POST_MODIFY_FN, (void *) multimaster_betxnpostop_delete ) != 0 ) + slapi_pblock_set( pb, SLAPI_PLUGIN_BE_TXN_POST_ADD_FN, (void *) multimaster_betxnpostop_add ) != 0 || + slapi_pblock_set( pb, SLAPI_PLUGIN_BE_TXN_POST_MODIFY_FN, (void *) multimaster_betxnpostop_modify ) != 0 ) { slapi_log_error( SLAPI_LOG_PLUGIN, repl_plugin_name, "multimaster_betxnpostop_init failed\n" ); rc= -1; diff --git a/ldap/servers/plugins/replication/repl5_mtnode_ext.c b/ldap/servers/plugins/replication/repl5_mtnode_ext.c index 3043624..dd0d261 100644 --- a/ldap/servers/plugins/replication/repl5_mtnode_ext.c +++ b/ldap/servers/plugins/replication/repl5_mtnode_ext.c @@ -197,20 +197,19 @@ replica_get_replica_from_dn (const Slapi_DN *dn)
Object *replica_get_replica_for_op (Slapi_PBlock *pb) { - char *dn; - Slapi_DN *sdn; + Slapi_DN *sdn = NULL; Object *repl_obj = NULL;
if (pb) { /* get replica generation for this operation */ - slapi_pblock_get (pb, SLAPI_TARGET_DN, &dn); - sdn = slapi_sdn_new_dn_byref(dn); + slapi_pblock_get (pb, SLAPI_TARGET_SDN, &sdn); + if (NULL == sdn) { + goto bail; + } repl_obj = replica_get_replica_from_dn (sdn); - - slapi_sdn_free (&sdn); } - +bail: return repl_obj; }
diff --git a/ldap/servers/plugins/replication/repl5_plugins.c b/ldap/servers/plugins/replication/repl5_plugins.c index a036b0a..a0d45fb 100644 --- a/ldap/servers/plugins/replication/repl5_plugins.c +++ b/ldap/servers/plugins/replication/repl5_plugins.c @@ -1079,7 +1079,7 @@ write_changelog_and_ruv (Slapi_PBlock *pb) slapi_log_error(SLAPI_LOG_FATAL, repl_plugin_name, "write_changelog_and_ruv: can't add a change for " "%s (uniqid: %s, optype: %lu) to changelog csn %s\n", - op_params->target_address.dn, + REPL_GET_DN(&op_params->target_address), op_params->target_address.uniqueid, op_params->operation_type, csn_as_string(op_params->csn, PR_FALSE, csn_str)); diff --git a/ldap/servers/plugins/replication/repl5_replica.c b/ldap/servers/plugins/replication/repl5_replica.c index 2a24f3e..acb7d1f 100644 --- a/ldap/servers/plugins/replication/repl5_replica.c +++ b/ldap/servers/plugins/replication/repl5_replica.c @@ -1858,13 +1858,14 @@ static char* _replica_get_config_dn (const Slapi_DN *root) { char *dn; + /* "cn=mapping tree,cn=config" */ const char *mp_base = slapi_get_mapping_tree_config_root ();
PR_ASSERT (root);
/* This function converts the old style DN to the new style. */ - dn = slapi_create_dn_string("%s,cn="%s",%s", - REPLICA_RDN, slapi_sdn_get_dn (root), mp_base); + dn = slapi_ch_smprintf("%s,cn="%s",%s", + REPLICA_RDN, slapi_sdn_get_dn (root), mp_base); return dn; }
@@ -2328,9 +2329,9 @@ replica_write_ruv (Replica *r) pb = slapi_pblock_new();
/* replica name never changes so it is ok to reference it outside the lock */ - slapi_modify_internal_set_pb( + slapi_modify_internal_set_pb_ext( pb, - slapi_sdn_get_dn(r->repl_root), /* only used to select be */ + r->repl_root, /* only used to select be */ mods, NULL, /* controls */ RUV_STORAGE_ENTRY_UNIQUEID, @@ -3079,11 +3080,11 @@ replica_remove_legacy_attr (const Slapi_DN *repl_root_sdn, const char *attr) ctrls[1] = NULL;
/* remove copiedFrom/copyingFrom first */ - slapi_modify_internal_set_pb (pb, slapi_sdn_get_dn (repl_root_sdn), - slapi_mods_get_ldapmods_passout (&smods), ctrls, - NULL /*uniqueid */, - repl_get_plugin_identity (PLUGIN_MULTIMASTER_REPLICATION) , - 0 /* operation_flags */); + slapi_modify_internal_set_pb_ext (pb, repl_root_sdn, + slapi_mods_get_ldapmods_passout (&smods), + ctrls, NULL /*uniqueid */, + repl_get_plugin_identity (PLUGIN_MULTIMASTER_REPLICATION) , + 0 /* operation_flags */);
slapi_modify_internal_pb (pb); slapi_pblock_get(pb, SLAPI_PLUGIN_INTOP_RESULT, &rc); @@ -3120,7 +3121,7 @@ replica_log_ruv_elements_nolock (const Replica *r) special target dn */ memset (&op_params, 0, sizeof (op_params)); op_params.operation_type = SLAPI_OPERATION_DELETE; - op_params.target_address.dn = START_ITERATION_ENTRY_DN; + op_params.target_address.sdn = slapi_sdn_new_dn_byval(START_ITERATION_ENTRY_DN); op_params.target_address.uniqueid = START_ITERATION_ENTRY_UNIQUEID; op_params.csn = csn; repl_gen = ruv_get_replica_generation (ruv); @@ -3132,6 +3133,7 @@ replica_log_ruv_elements_nolock (const Replica *r) rc = -1;
slapi_ch_free ((void**)&repl_gen); + slapi_sdn_free(&op_params.target_address.sdn); csn_free (&csn); }
@@ -3221,9 +3223,9 @@ replica_replace_ruv_tombstone(Replica *r) mods [2] = NULL; pb = slapi_pblock_new();
- slapi_modify_internal_set_pb( + slapi_modify_internal_set_pb_ext( pb, - (char*)slapi_sdn_get_dn (r->repl_root), /* only used to select be */ + r->repl_root, /* only used to select be */ mods, NULL, /* controls */ RUV_STORAGE_ENTRY_UNIQUEID, diff --git a/ldap/servers/plugins/replication/repl5_replica_config.c b/ldap/servers/plugins/replication/repl5_replica_config.c index e31078f..eb23c21 100644 --- a/ldap/servers/plugins/replication/repl5_replica_config.c +++ b/ldap/servers/plugins/replication/repl5_replica_config.c @@ -871,6 +871,7 @@ replica_task_done(Replica *replica) { int rc = LDAP_OPERATIONS_ERROR; char *replica_dn = NULL; + Slapi_DN *replica_sdn = NULL; Slapi_PBlock *pb = NULL; LDAPMod *mods [2]; LDAPMod mod; @@ -878,13 +879,14 @@ replica_task_done(Replica *replica) return rc; } /* dn: cn=replica,cn=dc\3Dexample\2Cdc\3Dcom,cn=mapping tree,cn=config */ - replica_dn = slapi_create_dn_string("%s,cn="%s",%s", - REPLICA_RDN, - slapi_sdn_get_dn(replica_get_root(replica)), - CONFIG_BASE); + replica_dn = slapi_ch_smprintf("%s,cn="%s",%s", + REPLICA_RDN, + slapi_sdn_get_dn(replica_get_root(replica)), + CONFIG_BASE); if (NULL == replica_dn) { return rc; } + replica_sdn = slapi_sdn_new_dn_passin(replica_dn); pb = slapi_pblock_new(); mods[0] = &mod; mods[1] = NULL; @@ -892,7 +894,7 @@ replica_task_done(Replica *replica) mod.mod_type = (char *)TASK_ATTR; mod.mod_bvalues = NULL;
- slapi_modify_internal_set_pb(pb, replica_dn, mods, NULL/* controls */, + slapi_modify_internal_set_pb_ext(pb, replica_sdn, mods, NULL/* controls */, NULL/* uniqueid */, repl_get_plugin_identity (PLUGIN_MULTIMASTER_REPLICATION), 0/* flags */); @@ -908,7 +910,7 @@ replica_task_done(Replica *replica) }
slapi_pblock_destroy (pb); - slapi_ch_free_string(&replica_dn); + slapi_sdn_free(&replica_sdn);
return rc; } diff --git a/ldap/servers/plugins/replication/repl5_updatedn_list.c b/ldap/servers/plugins/replication/repl5_updatedn_list.c index 8cdb8d5..e8ab027 100644 --- a/ldap/servers/plugins/replication/repl5_updatedn_list.c +++ b/ldap/servers/plugins/replication/repl5_updatedn_list.c @@ -208,7 +208,7 @@ static int convert_to_string(Slapi_DN *dn, void *arg) { struct list_to_string_data *data = (struct list_to_string_data *)arg; - int newlen = strlen(slapi_sdn_get_dn(dn)) + strlen(data->delimiter) + 1; + int newlen = slapi_sdn_get_ndn_len(dn) + strlen(data->delimiter) + 1; if (data->string) { newlen += strlen(data->string); data->string = slapi_ch_realloc(data->string, newlen); diff --git a/ldap/servers/plugins/replication/repl_bind.c b/ldap/servers/plugins/replication/repl_bind.c index a7eb78c..dbc77a6 100644 --- a/ldap/servers/plugins/replication/repl_bind.c +++ b/ldap/servers/plugins/replication/repl_bind.c @@ -51,13 +51,15 @@ int legacy_preop_bind( Slapi_PBlock *pb ) { int return_value = 0; - char *dn = NULL; + const char *dn = NULL; + Slapi_DN *sdn = NULL; struct berval *cred = NULL; int method;
slapi_pblock_get(pb, SLAPI_BIND_METHOD, &method); - slapi_pblock_get(pb, SLAPI_BIND_TARGET, &dn); + slapi_pblock_get(pb, SLAPI_BIND_TARGET_SDN, &sdn); slapi_pblock_get(pb, SLAPI_BIND_CREDENTIALS, &cred); + dn = slapi_sdn_get_dn(sdn);
if (LDAP_AUTH_SIMPLE == method) { diff --git a/ldap/servers/plugins/replication/repl_compare.c b/ldap/servers/plugins/replication/repl_compare.c index acb0d69..3e1878d 100644 --- a/ldap/servers/plugins/replication/repl_compare.c +++ b/ldap/servers/plugins/replication/repl_compare.c @@ -48,16 +48,20 @@ int legacy_preop_compare( Slapi_PBlock *pb ) { int is_replicated_operation = 0; - char *compare_base = NULL; struct berval **referral = NULL; int return_code = 0; - Slapi_DN *basesdn; + Slapi_DN *basesdn = NULL;
slapi_pblock_get(pb, SLAPI_IS_REPLICATED_OPERATION, &is_replicated_operation); - slapi_pblock_get(pb, SLAPI_COMPARE_TARGET, &compare_base); - basesdn= slapi_sdn_new_dn_byref(compare_base); - referral = get_data_source(pb, basesdn, 1, NULL); - slapi_sdn_free(&basesdn); + slapi_pblock_get(pb, SLAPI_COMPARE_TARGET_SDN, &basesdn); + if (NULL == basesdn) { + slapi_send_ldap_result(pb, LDAP_OPERATIONS_ERROR, NULL, + "Null target DN", 0, NULL ); + + return_code = 1; /* return 1 to prevent further search processing */ + goto bail; + } + referral = get_data_source(pb, basesdn, 1, NULL); if (NULL != referral && !is_replicated_operation) { /* @@ -68,5 +72,6 @@ legacy_preop_compare( Slapi_PBlock *pb ) return_code = 1; /* return 1 to prevent further search processing */ } slapi_ch_free((void**)&referral); +bail: return return_code; } diff --git a/ldap/servers/plugins/replication/repl_connext.c b/ldap/servers/plugins/replication/repl_connext.c index 0b46c5e..2969b15 100644 --- a/ldap/servers/plugins/replication/repl_connext.c +++ b/ldap/servers/plugins/replication/repl_connext.c @@ -97,7 +97,7 @@ void consumer_connection_extension_destructor (void *ext, void *object, void *pa if (NULL != repl_root_sdn) { slapi_pblock_set(pb, SLAPI_CONNECTION, connext->connection); - slapi_pblock_set(pb, SLAPI_TARGET_DN, (void*)slapi_sdn_get_dn(repl_root_sdn)); + slapi_pblock_set(pb, SLAPI_TARGET_SDN, (void*)repl_root_sdn); slapi_pblock_get(pb, SLAPI_CONN_ID, &connid); slapi_log_error(SLAPI_LOG_REPL, repl_plugin_name, "Aborting total update in progress for replicated " diff --git a/ldap/servers/plugins/replication/repl_extop.c b/ldap/servers/plugins/replication/repl_extop.c index ffbf2a9..2ff3627 100644 --- a/ldap/servers/plugins/replication/repl_extop.c +++ b/ldap/servers/plugins/replication/repl_extop.c @@ -947,7 +947,7 @@ multimaster_extop_StartNSDS50ReplicationRequest(Slapi_PBlock *pb) * But what do we do if mapping tree could not be updated ? */
/* start the bulk import */ - slapi_pblock_set (pb, SLAPI_TARGET_DN, repl_root); + slapi_pblock_set (pb, SLAPI_TARGET_SDN, repl_root_sdn); rc = slapi_start_bulk_import (pb); if (rc != LDAP_SUCCESS) { @@ -1090,10 +1090,8 @@ send_response: slapi_ch_free((void **)&replicacsnstr);
/* repl_root_sdn */ - if (NULL != repl_root_sdn) - { - slapi_sdn_free(&repl_root_sdn); - } + slapi_sdn_free(&repl_root_sdn); + if (NSDS50_REPL_REPLICA_READY != response) { /* @@ -1163,6 +1161,7 @@ multimaster_extop_EndNSDS50ReplicationRequest(Slapi_PBlock *pb) { int return_value = SLAPI_PLUGIN_EXTENDED_NOT_HANDLED; char *repl_root = NULL; + Slapi_DN *repl_root_sdn = NULL; BerElement *resp_bere = NULL; struct berval *resp_bval = NULL; ber_int_t response; @@ -1208,8 +1207,16 @@ multimaster_extop_EndNSDS50ReplicationRequest(Slapi_PBlock *pb) enabled again */ replica_set_state_flag(r, REPLICA_TOTAL_IN_PROGRESS, PR_TRUE /* clear flag */);
- slapi_pblock_set (pb, SLAPI_TARGET_DN, repl_root); - slapi_stop_bulk_import (pb); + /* slapi_pblock_set (pb, SLAPI_TARGET_DN, repl_root); */ + /* Verify that repl_root names a valid replicated area */ + if ((repl_root_sdn = slapi_sdn_new_dn_byref(repl_root)) == NULL) + { + response = NSDS50_REPL_INTERNAL_ERROR; + goto send_response; + } + slapi_pblock_set (pb, SLAPI_TARGET_SDN, repl_root_sdn); + + slapi_stop_bulk_import (pb);
/* ONREPL - this is a bit of a hack. Once bulk import is finished, the replication function that responds to backend state change @@ -1273,7 +1280,7 @@ multimaster_extop_EndNSDS50ReplicationRequest(Slapi_PBlock *pb) goto free_and_return; } } - +send_response: /* Send the response code */ if ((resp_bere = der_alloc()) == NULL) { @@ -1291,6 +1298,8 @@ free_and_return: /* repl_root */ slapi_ch_free((void **)&repl_root);
+ slapi_sdn_free(&repl_root_sdn); + /* BerElement */ if (NULL != resp_bere) { diff --git a/ldap/servers/plugins/replication/replutil.c b/ldap/servers/plugins/replication/replutil.c index b828a2a..3eec20a 100644 --- a/ldap/servers/plugins/replication/replutil.c +++ b/ldap/servers/plugins/replication/replutil.c @@ -523,7 +523,7 @@ IsValidOperation (const slapi_operation_parameters *op) return PR_FALSE; }
- if (op->target_address.dn == NULL) + if (op->target_address.sdn == NULL) { slapi_log_error(SLAPI_LOG_FATAL, repl_plugin_name, "IsValidOperation: NULL entry DN\n"); @@ -1007,7 +1007,7 @@ repl_enable_chain_on_update(Slapi_DN *suffix) slapi_mods smods; int operation_result; Slapi_PBlock *pb= slapi_pblock_new(); - char *mtnnodedn; + Slapi_DN *mtnnodesdn;
slapi_mods_init(&smods,2);
@@ -1016,10 +1016,10 @@ repl_enable_chain_on_update(Slapi_DN *suffix) slapi_mods_add_string(&smods, LDAP_MOD_ADD, "nsslapd-distribution-funct", "repl_chain_on_update");
/* need DN of mapping tree node here */ - mtnnodedn = slapi_get_mapping_tree_node_configdn(suffix); - slapi_modify_internal_set_pb( + mtnnodesdn = slapi_get_mapping_tree_node_configsdn(suffix); + slapi_modify_internal_set_pb_ext( pb, - mtnnodedn, + mtnnodesdn, slapi_mods_get_ldapmods_byref(&smods), /* JCM cast */ NULL, /*Controls*/ NULL, /*uniqueid*/ @@ -1028,7 +1028,7 @@ repl_enable_chain_on_update(Slapi_DN *suffix)
slapi_modify_internal_pb(pb); slapi_pblock_get(pb, SLAPI_PLUGIN_INTOP_RESULT, &operation_result); - slapi_ch_free_string(&mtnnodedn); + slapi_sdn_free(&mtnnodesdn); slapi_pblock_destroy(pb); switch(operation_result) { @@ -1051,7 +1051,7 @@ repl_disable_chain_on_update(Slapi_DN *suffix) slapi_mods smods; int operation_result; Slapi_PBlock *pb= slapi_pblock_new(); - char *mtnnodedn; + Slapi_DN *mtnnodesdn;
slapi_mods_init(&smods,2);
@@ -1059,10 +1059,10 @@ repl_disable_chain_on_update(Slapi_DN *suffix) slapi_mods_add_modbvps(&smods, LDAP_MOD_DELETE, "nsslapd-distribution-funct", NULL);
/* need DN of mapping tree node here */ - mtnnodedn = slapi_get_mapping_tree_node_configdn(suffix); - slapi_modify_internal_set_pb( + mtnnodesdn = slapi_get_mapping_tree_node_configsdn(suffix); + slapi_modify_internal_set_pb_ext( pb, - mtnnodedn, + mtnnodesdn, slapi_mods_get_ldapmods_byref(&smods), /* JCM cast */ NULL, /*Controls*/ NULL, /*uniqueid*/ @@ -1071,7 +1071,7 @@ repl_disable_chain_on_update(Slapi_DN *suffix)
slapi_modify_internal_pb(pb); slapi_pblock_get(pb, SLAPI_PLUGIN_INTOP_RESULT, &operation_result); - slapi_ch_free_string(&mtnnodedn); + slapi_sdn_free(&mtnnodesdn); slapi_pblock_destroy(pb); switch(operation_result) { diff --git a/ldap/servers/plugins/replication/urp.c b/ldap/servers/plugins/replication/urp.c index 9410423..1328996 100644 --- a/ldap/servers/plugins/replication/urp.c +++ b/ldap/servers/plugins/replication/urp.c @@ -55,11 +55,10 @@ extern int slapi_log_urp; static int urp_add_resolve_parententry (Slapi_PBlock *pb, char *sessionid, Slapi_Entry *entry, Slapi_Entry *parententry, CSN *opcsn); static int urp_annotate_dn (char *sessionid, Slapi_Entry *entry, CSN *opcsn, const char *optype); static int urp_naming_conflict_removal (Slapi_PBlock *pb, char *sessionid, CSN *opcsn, const char *optype); -static int mod_namingconflict_attr (const char *uniqueid, const char*entrydn, const char *conflictdn, CSN *opcsn); +static int mod_namingconflict_attr (const char *uniqueid, const Slapi_DN *entrysdn, const Slapi_DN *conflictsdn, CSN *opcsn); static int del_replconflict_attr (Slapi_Entry *entry, CSN *opcsn, int opflags); static char *get_dn_plus_uniqueid(char *sessionid,const char *olddn,const char *uniqueid); static char *get_rdn_plus_uniqueid(char *sessionid,const char *olddn,const char *uniqueid); -static void set_pblock_dn (Slapi_PBlock* pb,int pblock_parameter,char *newdn); static int is_suffix_entry (Slapi_PBlock *pb, Slapi_Entry *entry, Slapi_DN **parenddn);
/* @@ -122,7 +121,8 @@ urp_add_operation( Slapi_PBlock *pb ) char sessionid[REPL_SESSION_ID_SIZE]; int r; int op_result= 0; - int rc= 0; /* OK */ + int rc= 0; /* OK */ + Slapi_DN *sdn = NULL;
if ( slapi_op_abandoned(pb) ) { @@ -206,8 +206,14 @@ urp_add_operation( Slapi_PBlock *pb ) */ slapi_value_set_string (*vals, buf); } - slapi_entry_set_dn (addentry,slapi_ch_strdup(newdn)); - set_pblock_dn(pb,SLAPI_ADD_TARGET,newdn); /* consumes newdn */ + /* slapi_pblock_get(pb, SLAPI_ADD_TARGET, &dn); */ + slapi_pblock_get(pb, SLAPI_ADD_TARGET_SDN, &sdn); + slapi_sdn_free(&sdn); + + slapi_entry_set_normdn(addentry, newdn); /* dn: passin */ + + sdn = slapi_sdn_dup(slapi_entry_get_sdn_const(addentry)); + slapi_pblock_set(pb, SLAPI_ADD_TARGET_SDN, sdn);
rdn = slapi_rdn_new_sdn ( slapi_entry_get_sdn_const(addentry) ); slapi_log_error (slapi_log_urp, sessionid, @@ -265,7 +271,6 @@ urp_modrdn_operation( Slapi_PBlock *pb ) Slapi_Entry *parent_entry; Slapi_Entry *new_parent_entry; Slapi_DN *newsuperior = NULL; - char *newsuperiordn; Slapi_DN *parentdn = NULL; Slapi_Entry *target_entry; Slapi_Entry *existing_entry; @@ -273,8 +278,8 @@ urp_modrdn_operation( Slapi_PBlock *pb ) CSN *opcsn= NULL; char *op_uniqueid = NULL; const char *existing_uniqueid = NULL; - const char *target_dn; - const char *existing_dn; + const Slapi_DN *target_sdn; + const Slapi_DN *existing_sdn; char *newrdn; char sessionid[REPL_SESSION_ID_SIZE]; int r; @@ -314,12 +319,12 @@ urp_modrdn_operation( Slapi_PBlock *pb ) }
/* The DN CSN is older than the Operation CSN. Apply the operation */ - target_dn = slapi_entry_get_dn_const ( target_entry); + target_sdn = slapi_entry_get_sdn_const (target_entry); slapi_pblock_get(pb, SLAPI_MODRDN_NEWRDN, &newrdn); slapi_pblock_get(pb, SLAPI_TARGET_UNIQUEID, &op_uniqueid); slapi_pblock_get(pb, SLAPI_MODRDN_PARENT_ENTRY, &parent_entry); slapi_pblock_get(pb, SLAPI_MODRDN_NEWPARENT_ENTRY, &new_parent_entry); - slapi_pblock_get(pb, SLAPI_MODRDN_NEWSUPERIOR, &newsuperiordn); + slapi_pblock_get(pb, SLAPI_MODRDN_NEWSUPERIOR_SDN, &newsuperior);
if ( is_tombstone_entry (target_entry) ) { @@ -366,7 +371,7 @@ urp_modrdn_operation( Slapi_PBlock *pb ) */
existing_uniqueid = slapi_entry_get_uniqueid (existing_entry); - existing_dn = slapi_entry_get_dn_const ( existing_entry); + existing_sdn = slapi_entry_get_sdn_const ( existing_entry);
/* * Dismiss the operation if the existing entry is the same as the target one. @@ -412,8 +417,8 @@ urp_modrdn_operation( Slapi_PBlock *pb ) Unique ID already in RDN - Change to Lost and Found entry */ goto bailout; } - mod_namingconflict_attr (op_uniqueid, target_dn, existing_dn, opcsn); - set_pblock_dn (pb, SLAPI_MODRDN_NEWRDN, newrdn_with_uniqueid); + mod_namingconflict_attr (op_uniqueid, target_sdn, existing_sdn, opcsn); + slapi_pblock_set(pb, SLAPI_MODRDN_NEWRDN, newrdn_with_uniqueid); slapi_log_error(slapi_log_urp, sessionid, "Naming conflict MODRDN. Rename target entry to %s\n", newrdn_with_uniqueid ); @@ -474,12 +479,12 @@ urp_modrdn_operation( Slapi_PBlock *pb )
/* The new superior entry doesn't exist */
- slapi_pblock_get(pb, SLAPI_MODRDN_NEWSUPERIOR, &newsuperiordn); - if(newsuperiordn == NULL) + slapi_pblock_get(pb, SLAPI_MODRDN_NEWSUPERIOR_SDN, &newsuperior); + if(newsuperior == NULL) { /* (new_parent_entry==NULL && newsuperiordn==NULL) * This is ok - SLAPI_MODRDN_NEWPARENT_ENTRY will - * only be set if SLAPI_MODRDN_NEWSUPERIOR was + * only be set if SLAPI_MODRDN_NEWSUPERIOR_SDN was * suplied by the client. If it wasn't, we're just * changing the RDN of the entry. In that case, * if the entry exists, its parent won't change @@ -491,10 +496,9 @@ urp_modrdn_operation( Slapi_PBlock *pb ) goto bailout; }
- newsuperior= slapi_sdn_new_dn_byval(newsuperiordn); - - if((0 == slapi_sdn_compare (slapi_entry_get_sdn(parent_entry), newsuperior)) || - is_suffix_dn (pb, newsuperior, &parentdn) ) + if((0 == slapi_sdn_compare(slapi_entry_get_sdn(parent_entry), + newsuperior)) || + is_suffix_dn (pb, newsuperior, &parentdn) ) { /* * The new superior is the same as the current one, or @@ -521,7 +525,8 @@ urp_modrdn_operation( Slapi_PBlock *pb ) * admin intercession */ slapi_log_error( SLAPI_LOG_FATAL, sessionid, - "Parent %s couldn't be found, nor recreated as a glue entry\n", newsuperiordn ); + "Parent %s couldn't be found, nor recreated as a glue entry\n", + slapi_sdn_get_dn(newsuperior) ); op_result= LDAP_OPERATIONS_ERROR; slapi_pblock_set(pb, SLAPI_RESULT_CODE, &op_result); rc = -1; @@ -542,8 +547,6 @@ bailout: } if ( parentdn ) slapi_sdn_free(&parentdn); - if ( newsuperior ) - slapi_sdn_free(&newsuperior); return rc; }
@@ -761,9 +764,9 @@ urp_fixup_rename_entry (Slapi_Entry *entry, const char *newrdn, int opflags) * Must mark this operation as replicated, * so that the frontend doesn't add extra attributes. */ - slapi_rename_internal_set_pb ( + slapi_rename_internal_set_pb_ext ( newpb, - slapi_entry_get_dn_const (entry), + slapi_entry_get_sdn_const (entry), newrdn, /*NewRDN*/ NULL, /*NewSuperior*/ 0, /* !Delete Old RDNS */ @@ -815,7 +818,7 @@ urp_fixup_delete_entry (const char *uniqueid, const char *dn, CSN *opcsn, int op }
int -urp_fixup_modify_entry (const char *uniqueid, const char *dn, CSN *opcsn, Slapi_Mods *smods, int opflags) +urp_fixup_modify_entry (const char *uniqueid, const Slapi_DN *sdn, CSN *opcsn, Slapi_Mods *smods, int opflags) { Slapi_PBlock *newpb; Slapi_Operation *op; @@ -823,9 +826,9 @@ urp_fixup_modify_entry (const char *uniqueid, const char *dn, CSN *opcsn, Slapi_
newpb = slapi_pblock_new(); - slapi_modify_internal_set_pb ( + slapi_modify_internal_set_pb_ext ( newpb, - dn, + sdn, slapi_mods_get_ldapmods_byref (smods), NULL, /* Controls */ uniqueid, @@ -852,6 +855,7 @@ urp_add_resolve_parententry (Slapi_PBlock *pb, char *sessionid, Slapi_Entry *ent char *newdn = NULL; int ldap_rc; int rc = 0; + Slapi_DN *sdn = NULL;
if( is_suffix_entry (pb, entry, &parentdn) ) { @@ -928,8 +932,15 @@ urp_add_resolve_parententry (Slapi_PBlock *pb, char *sessionid, Slapi_Entry *ent */ add_rdn = slapi_rdn_new_dn(slapi_entry_get_dn_const (entry)); newdn = slapi_dn_plus_rdn(slapi_entry_get_dn_const (parententry), slapi_rdn_get_rdn(add_rdn)); - slapi_entry_set_dn ( entry,slapi_ch_strdup(newdn)); - set_pblock_dn (pb,SLAPI_ADD_TARGET,newdn); /* consumes newdn */ + slapi_entry_set_normdn ( entry, newdn ); + + /* slapi_pblock_get(pb, SLAPI_ADD_TARGET, &dn); */ + slapi_pblock_get(pb, SLAPI_ADD_TARGET_SDN, &sdn); + slapi_sdn_free(&sdn); + + sdn = slapi_sdn_dup(slapi_entry_get_sdn_const(entry)); + slapi_pblock_set(pb, SLAPI_ADD_TARGET_SDN, sdn); + slapi_log_error ( slapi_log_urp, sessionid, "Parent was renamed. Renamed the child to %s\n", newdn ); rc= slapi_setbit_int(rc,SLAPI_RTN_BIT_FETCH_EXISTING_DN_ENTRY); @@ -957,15 +968,17 @@ urp_annotate_dn (char *sessionid, Slapi_Entry *entry, CSN *opcsn, const char *op int op_result; char *newrdn; const char *uniqueid; + const Slapi_DN *basesdn; const char *basedn; char ebuf[BUFSIZ];
uniqueid = slapi_entry_get_uniqueid (entry); - basedn = slapi_entry_get_ndn (entry); + basesdn = slapi_entry_get_sdn_const (entry); + basedn = slapi_entry_get_dn_const (entry); newrdn = get_rdn_plus_uniqueid ( sessionid, basedn, uniqueid ); if(newrdn!=NULL) { - mod_namingconflict_attr (uniqueid, basedn, basedn, opcsn); + mod_namingconflict_attr (uniqueid, basesdn, basesdn, opcsn); op_result = urp_fixup_rename_entry ( entry, newrdn, 0 ); switch(op_result) { @@ -1094,7 +1107,7 @@ urp_get_min_naming_conflict_entry ( Slapi_PBlock *pb, char *sessionid, CSN *opcs }
done: - slapi_ch_free((void **)&parent_dn); + slapi_ch_free_string(&parent_dn); if (filter) { PR_smprintf_free(filter); } @@ -1240,15 +1253,6 @@ get_rdn_plus_uniqueid(char *sessionid, const char *olddn, const char *uniqueid) return newrdn; }
-static void -set_pblock_dn (Slapi_PBlock* pb,int pblock_parameter,char *newdn) -{ - char *olddn; - slapi_pblock_get( pb, pblock_parameter, &olddn ); - slapi_ch_free((void**)&olddn); - slapi_pblock_set( pb, pblock_parameter, newdn ); -} - static int is_suffix_entry ( Slapi_PBlock *pb, Slapi_Entry *entry, Slapi_DN **parentdn ) { @@ -1272,15 +1276,18 @@ is_suffix_dn ( Slapi_PBlock *pb, const Slapi_DN *dn, Slapi_DN **parentdn ) }
static int -mod_namingconflict_attr (const char *uniqueid, const char *entrydn, const char *conflictdn, CSN *opcsn) +mod_namingconflict_attr (const char *uniqueid, const Slapi_DN *entrysdn, + const Slapi_DN *conflictsdn, CSN *opcsn) { Slapi_Mods smods; char buf[BUFSIZ]; int op_result;
- PR_snprintf (buf, sizeof(buf), "%s %s", REASON_ANNOTATE_DN, conflictdn); + PR_snprintf (buf, sizeof(buf), "%s %s", + REASON_ANNOTATE_DN, slapi_sdn_get_dn(conflictsdn)); slapi_mods_init (&smods, 2); - if ( strncmp (entrydn, SLAPI_ATTR_UNIQUEID, strlen(SLAPI_ATTR_UNIQUEID)) != 0 ) + if ( strncmp (slapi_sdn_get_dn(entrysdn), SLAPI_ATTR_UNIQUEID, + strlen(SLAPI_ATTR_UNIQUEID)) != 0 ) { slapi_mods_add (&smods, LDAP_MOD_ADD, ATTR_NSDS5_REPLCONFLICT, strlen(buf), buf); } @@ -1293,7 +1300,7 @@ mod_namingconflict_attr (const char *uniqueid, const char *entrydn, const char * */ slapi_mods_add (&smods, LDAP_MOD_REPLACE, ATTR_NSDS5_REPLCONFLICT, strlen(buf), buf); } - op_result = urp_fixup_modify_entry (uniqueid, entrydn, opcsn, &smods, 0); + op_result = urp_fixup_modify_entry (uniqueid, entrysdn, opcsn, &smods, 0); slapi_mods_done (&smods); return op_result; } @@ -1308,13 +1315,13 @@ del_replconflict_attr (Slapi_Entry *entry, CSN *opcsn, int opflags) { Slapi_Mods smods; const char *uniqueid; - const char *entrydn; + const Slapi_DN *entrysdn;
uniqueid = slapi_entry_get_uniqueid (entry); - entrydn = slapi_entry_get_dn_const (entry); + entrysdn = slapi_entry_get_sdn_const (entry); slapi_mods_init (&smods, 2); slapi_mods_add (&smods, LDAP_MOD_DELETE, ATTR_NSDS5_REPLCONFLICT, 0, NULL); - op_result = urp_fixup_modify_entry (uniqueid, entrydn, opcsn, &smods, opflags); + op_result = urp_fixup_modify_entry (uniqueid, entrysdn, opcsn, &smods, opflags); slapi_mods_done (&smods); } return op_result; diff --git a/ldap/servers/plugins/replication/urp.h b/ldap/servers/plugins/replication/urp.h index ff4d51a..2ca7ad2 100644 --- a/ldap/servers/plugins/replication/urp.h +++ b/ldap/servers/plugins/replication/urp.h @@ -60,7 +60,7 @@ int urp_post_modrdn_operation( Slapi_PBlock *pb ); int urp_fixup_add_entry (Slapi_Entry *e, const char *target_uniqueid, const char *parentuniqueid, CSN *opcsn, int opflags); int urp_fixup_delete_entry (const char *uniqueid, const char *dn, CSN *opcsn, int opflags); int urp_fixup_rename_entry (Slapi_Entry *entry, const char *newrdn, int opflags); -int urp_fixup_modify_entry (const char *uniqueid, const char *dn, CSN *opcsn, Slapi_Mods *smods, int opflags); +int urp_fixup_modify_entry (const char *uniqueid, const Slapi_DN *sdn, CSN *opcsn, Slapi_Mods *smods, int opflags);
int is_suffix_dn (Slapi_PBlock *pb, const Slapi_DN *dn, Slapi_DN **parenddn);
diff --git a/ldap/servers/plugins/replication/urp_glue.c b/ldap/servers/plugins/replication/urp_glue.c index 15b29d4..e51712c 100644 --- a/ldap/servers/plugins/replication/urp_glue.c +++ b/ldap/servers/plugins/replication/urp_glue.c @@ -96,11 +96,13 @@ entry_to_glue(char *sessionid, const Slapi_Entry* entry, const char *reason, CSN { int op_result = 0; const char *dn; + const Slapi_DN *sdn; char ebuf[BUFSIZ]; slapi_mods smods; Slapi_Attr *attr;
dn = slapi_entry_get_dn_const (entry); + sdn = slapi_entry_get_sdn_const (entry); slapi_mods_init(&smods, 4); /* richm: sometimes the entry is already a glue entry (how did that happen?) @@ -133,7 +135,7 @@ entry_to_glue(char *sessionid, const Slapi_Entry* entry, const char *reason, CSN
if (slapi_mods_get_num_mods(&smods) > 0) { - op_result = urp_fixup_modify_entry (NULL, dn, opcsn, &smods, 0); + op_result = urp_fixup_modify_entry (NULL, sdn, opcsn, &smods, 0); if (op_result == LDAP_SUCCESS) { slapi_log_error (slapi_log_urp, repl_plugin_name, diff --git a/ldap/servers/plugins/replication/urp_tombstone.c b/ldap/servers/plugins/replication/urp_tombstone.c index e183cb1..6dd9a2a 100644 --- a/ldap/servers/plugins/replication/urp_tombstone.c +++ b/ldap/servers/plugins/replication/urp_tombstone.c @@ -181,7 +181,7 @@ tombstone_to_glue ( */ addingentry = slapi_entry_dup(tombstoneentry); addingdn = slapi_sdn_get_dn(tombstonedn); - slapi_entry_set_dn(addingentry,slapi_ch_strdup(addingdn)); /* consumes DN */ + slapi_entry_set_sdn(addingentry, tombstonedn);
if (!slapi_entry_attr_hasvalue(addingentry, ATTR_NSDS5_REPLCONFLICT, reason)) { @@ -227,7 +227,9 @@ entry_to_tombstone ( Slapi_PBlock *pb, Slapi_Entry *entry ) */ slapi_mods_add ( &smods, LDAP_MOD_DELETE, ATTR_NSDS5_REPLCONFLICT, 0, NULL );
- op_result = urp_fixup_modify_entry (uniqueid, slapi_entry_get_dn_const (entry), opcsn, &smods, 0); + op_result = urp_fixup_modify_entry (uniqueid, + slapi_entry_get_sdn_const (entry), + opcsn, &smods, 0); slapi_mods_done ( &smods );
/* diff --git a/ldap/servers/plugins/replication/windows_connection.c b/ldap/servers/plugins/replication/windows_connection.c index 9205393..f2bda92 100644 --- a/ldap/servers/plugins/replication/windows_connection.c +++ b/ldap/servers/plugins/replication/windows_connection.c @@ -552,7 +552,7 @@ windows_LDAPMessage2Entry(Repl_Connection *conn, LDAPMessage * msg, int attrsonl slapi_entry_free(e); return NULL; } - slapi_entry_set_dn( rawentry, slapi_ch_strdup(slapi_entry_get_dn(e)) ); + slapi_entry_set_sdn( rawentry, slapi_entry_get_sdn(e) );
for ( a = ldap_first_attribute( ld, msg, &ber ); a!=NULL; a=ldap_next_attribute( ld, msg, ber ) ) { diff --git a/ldap/servers/plugins/replication/windows_private.c b/ldap/servers/plugins/replication/windows_private.c index f36814b..6c19e4a 100644 --- a/ldap/servers/plugins/replication/windows_private.c +++ b/ldap/servers/plugins/replication/windows_private.c @@ -772,7 +772,6 @@ windows_private_save_dirsync_cookie(const Repl_Agmt *ra) { Dirsync_Private *dp = NULL; Slapi_PBlock *pb = NULL; - const char* dn = NULL; Slapi_DN* sdn = NULL; int rc = 0; Slapi_Mods *mods = NULL; @@ -788,12 +787,12 @@ windows_private_save_dirsync_cookie(const Repl_Agmt *ra)
pb = slapi_pblock_new ();
- mods = windows_private_get_cookie_mod(dp, LDAP_MOD_REPLACE); - sdn = slapi_sdn_dup( agmt_get_dn_byref(ra) ); - dn = slapi_sdn_get_dn(sdn); + mods = windows_private_get_cookie_mod(dp, LDAP_MOD_REPLACE); + sdn = slapi_sdn_dup( agmt_get_dn_byref(ra) );
- slapi_modify_internal_set_pb (pb, dn, slapi_mods_get_ldapmods_byref(mods), NULL, NULL, - repl_get_plugin_identity(PLUGIN_MULTIMASTER_REPLICATION), 0); + slapi_modify_internal_set_pb_ext (pb, sdn, + slapi_mods_get_ldapmods_byref(mods), NULL, NULL, + repl_get_plugin_identity(PLUGIN_MULTIMASTER_REPLICATION), 0); slapi_modify_internal_pb (pb);
slapi_pblock_get(pb, SLAPI_PLUGIN_INTOP_RESULT, &rc); @@ -802,8 +801,9 @@ windows_private_save_dirsync_cookie(const Repl_Agmt *ra) { /* try again, but as an add instead */ slapi_mods_free(&mods); mods = windows_private_get_cookie_mod(dp, LDAP_MOD_ADD); - slapi_modify_internal_set_pb (pb, dn, slapi_mods_get_ldapmods_byref(mods), NULL, NULL, - repl_get_plugin_identity(PLUGIN_MULTIMASTER_REPLICATION), 0); + slapi_modify_internal_set_pb_ext (pb, sdn, + slapi_mods_get_ldapmods_byref(mods), NULL, NULL, + repl_get_plugin_identity(PLUGIN_MULTIMASTER_REPLICATION), 0); slapi_modify_internal_pb (pb); slapi_pblock_get(pb, SLAPI_PLUGIN_INTOP_RESULT, &rc); diff --git a/ldap/servers/plugins/replication/windows_protocol_util.c b/ldap/servers/plugins/replication/windows_protocol_util.c index 771475b..eb7fd00 100644 --- a/ldap/servers/plugins/replication/windows_protocol_util.c +++ b/ldap/servers/plugins/replication/windows_protocol_util.c @@ -1296,8 +1296,9 @@ process_replay_rename(Private_Repl_Protocol *prp, remote_subtree?remote_subtree:"empty"); goto bail; } + /* newparent is already normzlized; just ignore the case */ norm_newparent = slapi_ch_strdup(newparent); - slapi_dn_normalize_case(norm_newparent); + slapi_dn_ignore_case(norm_newparent); p = strstr(norm_newparent, local_subtree); if (NULL == p) { slapi_log_error(SLAPI_LOG_FATAL, windows_repl_plugin_name, @@ -1389,7 +1390,7 @@ windows_replay_update(Private_Repl_Protocol *prp, slapi_operation_parameters *op LDAPDebug( LDAP_DEBUG_TRACE, "=> windows_replay_update\n", 0, 0, 0 );
- local_dn = slapi_sdn_new_dn_byref( op->target_address.dn ); + local_dn = slapi_sdn_dup( op->target_address.sdn );
/* Since we have the target uniqueid in the op structure, let's * fetch the local entry here using it. We do not want to search @@ -1415,7 +1416,8 @@ windows_replay_update(Private_Repl_Protocol *prp, slapi_operation_parameters *op "%s: windows_replay_update: failed to fetch local entry " "for %s operation dn="%s"\n", agmt_get_long_name(prp->agmt), - op2string(op->operation_type), op->target_address.dn); + op2string(op->operation_type), + REPL_GET_DN(&op->target_address)); goto error; } op->operation_type = SLAPI_OPERATION_DELETE; @@ -1427,12 +1429,14 @@ windows_replay_update(Private_Repl_Protocol *prp, slapi_operation_parameters *op slapi_log_error(SLAPI_LOG_FATAL, repl_plugin_name, "%s: windows_replay_update: failed to fetch local entry for %s operation dn="%s"\n", agmt_get_long_name(prp->agmt), - op2string(op->operation_type), op->target_address.dn); + op2string(op->operation_type), + REPL_GET_DN(&op->target_address)); } else { slapi_log_error(SLAPI_LOG_REPL, repl_plugin_name, "%s: windows_replay_update: Looking at %s operation local dn="%s" (%s)\n", agmt_get_long_name(prp->agmt), - op2string(op->operation_type), op->target_address.dn, "ours"); + op2string(op->operation_type), + REPL_GET_DN(&op->target_address), "ours"); } /* Just bail on this change. We don't want to do any * further checks since we don't have a local entry. */ @@ -1450,7 +1454,8 @@ windows_replay_update(Private_Repl_Protocol *prp, slapi_operation_parameters *op slapi_log_error(SLAPI_LOG_REPL, repl_plugin_name, "%s: windows_replay_update: Looking at %s operation local dn="%s" (%s,%s,%s)\n", agmt_get_long_name(prp->agmt), - op2string(op->operation_type), op->target_address.dn, is_ours ? "ours" : "not ours", + op2string(op->operation_type), + REPL_GET_DN(&op->target_address), is_ours ? "ours" : "not ours", is_user ? "user" : "not user", is_group ? "group" : "not group");
if (is_ours && (is_user || is_group) ) { @@ -1463,14 +1468,16 @@ windows_replay_update(Private_Repl_Protocol *prp, slapi_operation_parameters *op "%s: windows_replay_update: failed map dn for %s operation dn="%s"" "rc=%d remote_dn = [%s]\n", agmt_get_long_name(prp->agmt), - op2string(op->operation_type), op->target_address.dn, + op2string(op->operation_type), + REPL_GET_DN(&op->target_address), rc, remote_dn ? slapi_sdn_get_dn(remote_dn) : "(null)"); goto error; } slapi_log_error(SLAPI_LOG_REPL, repl_plugin_name, "%s: windows_replay_update: Processing %s operation local dn="%s" remote dn="%s"\n", agmt_get_long_name(prp->agmt), - op2string(op->operation_type), op->target_address.dn, slapi_sdn_get_dn(remote_dn)); + op2string(op->operation_type), + REPL_GET_DN(&op->target_address), slapi_sdn_get_dn(remote_dn)); switch (op->operation_type) { case SLAPI_OPERATION_ADD: return_value = process_replay_add(prp,op->p.p_add.target_entry,local_entry,local_dn,remote_dn,is_user,missing_entry,&password); @@ -1584,7 +1591,7 @@ windows_replay_update(Private_Repl_Protocol *prp, slapi_operation_parameters *op { return_value = process_replay_rename(prp, local_entry, local_dn, op->p.p_modrdn.modrdn_newrdn, - op->p.p_modrdn.modrdn_newsuperior_address.dn, + REPL_GET_DN(&op->p.p_modrdn.modrdn_newsuperior_address), op->p.p_modrdn.modrdn_deloldrdn, is_user, is_group); if (CONN_OPERATION_FAILED == return_value) { @@ -4446,6 +4453,7 @@ windows_update_local_entry(Private_Repl_Protocol *prp,Slapi_Entry *remote_entry, Slapi_PBlock *pb = NULL; int do_modify = 0; char *newsuperior = NULL; + Slapi_DN newsuperior_sdn; const char *newrdn = NULL; int is_user = 0, is_group = 0; const char *newdn = NULL; @@ -4467,8 +4475,8 @@ windows_update_local_entry(Private_Repl_Protocol *prp,Slapi_Entry *remote_entry,
/* Compare the local and mapped RDNs if it is a group */ /* If they don't match, set it to newrdn. */ - if (is_group && strcmp(slapi_sdn_get_ndn(slapi_entry_get_sdn(local_entry)), - slapi_sdn_get_ndn(mapped_sdn))) { + if (is_group && strcmp(slapi_entry_get_ndn(local_entry), + slapi_sdn_get_ndn(mapped_sdn))) { newdn = slapi_sdn_get_dn(mapped_sdn); slapi_rdn_set_dn(&rdn, newdn); newrdn = slapi_rdn_get_rdn(&rdn); @@ -4494,13 +4502,15 @@ windows_update_local_entry(Private_Repl_Protocol *prp,Slapi_Entry *remote_entry, slapi_log_error(SLAPI_LOG_REPL, windows_repl_plugin_name, "renaming entry "%s" - " "(newrdn: "%s", newsuperior: "%s"\n", newdn, newrdn ? newrdn:"NULL", newsuperior ? newsuperior:"NULL"); - slapi_rename_internal_set_pb (pb, - slapi_sdn_get_dn(slapi_entry_get_sdn(local_entry)), - newrdn, newsuperior, 1 /* delete old RDNS */, + slapi_sdn_init_dn_byref(&newsuperior_sdn, newsuperior); + slapi_rename_internal_set_pb_ext (pb, + slapi_entry_get_sdn(local_entry), + newrdn, &newsuperior_sdn, 1 /* delete old RDNS */, NULL /* controls */, NULL /* uniqueid */, repl_get_plugin_identity(PLUGIN_MULTIMASTER_REPLICATION), 0); slapi_modrdn_internal_pb (pb); slapi_pblock_get(pb, SLAPI_PLUGIN_INTOP_RESULT, &retval); + slapi_sdn_done(&newsuperior_sdn); slapi_pblock_destroy (pb); if (LDAP_SUCCESS != retval) { slapi_log_error(SLAPI_LOG_FATAL, windows_repl_plugin_name, @@ -4541,12 +4551,14 @@ windows_update_local_entry(Private_Repl_Protocol *prp,Slapi_Entry *remote_entry, if (pb) { char dnbuf[BUFSIZ]; - const char *dn = slapi_sdn_get_dn(slapi_entry_get_sdn_const(local_entry)); + const char *dn = slapi_entry_get_dn_const(local_entry); slapi_log_error(SLAPI_LOG_REPL, windows_repl_plugin_name, "modifying entry: %s\n", escape_string(dn, dnbuf)); - slapi_modify_internal_set_pb (pb, slapi_entry_get_ndn(local_entry), slapi_mods_get_ldapmods_byref(&smods), NULL, NULL, - repl_get_plugin_identity (PLUGIN_MULTIMASTER_REPLICATION), 0); - slapi_modify_internal_pb (pb); + slapi_modify_internal_set_pb_ext (pb, + slapi_entry_get_sdn(local_entry), + slapi_mods_get_ldapmods_byref(&smods), NULL, NULL, + repl_get_plugin_identity (PLUGIN_MULTIMASTER_REPLICATION), 0); + slapi_modify_internal_pb (pb); slapi_pblock_get (pb, SLAPI_PLUGIN_INTOP_RESULT, &rc); if (rc) { @@ -4564,7 +4576,7 @@ windows_update_local_entry(Private_Repl_Protocol *prp,Slapi_Entry *remote_entry, } else { char dnbuf[BUFSIZ]; - const char *dn = slapi_sdn_get_dn(slapi_entry_get_sdn_const(local_entry)); + const char *dn = slapi_entry_get_dn_const(local_entry); slapi_log_error(SLAPI_LOG_REPL, windows_repl_plugin_name, "no mods generated for local entry: %s\n", escape_string(dn, dnbuf)); } diff --git a/ldap/servers/plugins/retrocl/retrocl_po.c b/ldap/servers/plugins/retrocl/retrocl_po.c index 96be617..29ce79f 100644 --- a/ldap/servers/plugins/retrocl/retrocl_po.c +++ b/ldap/servers/plugins/retrocl/retrocl_po.c @@ -567,7 +567,7 @@ int retrocl_postob (Slapi_PBlock *pb,int optype) Slapi_Operation *op = NULL; LDAPMod **modrdn_mods = NULL; char *newrdn = NULL; - char *newsuperior = NULL; + Slapi_DN *newsuperior = NULL; Slapi_Backend *be = NULL; time_t curtime; int rc; @@ -641,7 +641,7 @@ int retrocl_postob (Slapi_PBlock *pb,int optype) (void)slapi_pblock_get( pb, SLAPI_MODRDN_NEWRDN, &newrdn ); (void)slapi_pblock_get( pb, SLAPI_MODRDN_DELOLDRDN, &flag ); (void)slapi_pblock_get( pb, SLAPI_MODIFY_MODS, &modrdn_mods ); - (void)slapi_pblock_get( pb, SLAPI_MODRDN_NEWSUPERIOR, &newsuperior); + (void)slapi_pblock_get( pb, SLAPI_MODRDN_NEWSUPERIOR_SDN, &newsuperior ); break; }
@@ -649,9 +649,7 @@ int retrocl_postob (Slapi_PBlock *pb,int optype) /* check if we should log change to retro changelog, and * if so, do it here */ write_replog_db( pb, optype, dn, log_m, flag, curtime, te, - newrdn, modrdn_mods, newsuperior ); + newrdn, modrdn_mods, slapi_sdn_get_dn(newsuperior) );
return 0; } - - diff --git a/ldap/servers/plugins/roles/roles_cache.c b/ldap/servers/plugins/roles/roles_cache.c index 912185d..83d3292 100644 --- a/ldap/servers/plugins/roles/roles_cache.c +++ b/ldap/servers/plugins/roles/roles_cache.c @@ -785,7 +785,8 @@ static int roles_cache_is_role_entry(struct slapi_entry *entry) */ void roles_cache_change_notify(Slapi_PBlock *pb) { - char *dn = NULL; + const char *dn = NULL; + Slapi_DN *sdn = NULL; struct slapi_entry *e = NULL; struct slapi_entry *pre = NULL; struct slapi_entry *entry = NULL; @@ -814,10 +815,10 @@ void roles_cache_change_notify(Slapi_PBlock *pb) return; }
- slapi_pblock_get(pb, SLAPI_TARGET_DN, &dn); - if( dn == NULL ) + slapi_pblock_get(pb, SLAPI_TARGET_SDN, &sdn); + if( sdn == NULL ) { - return; + return; }
slapi_pblock_get (pb, SLAPI_OPERATION, &pb_operation); @@ -932,6 +933,7 @@ if ( e != NULL )
if ( top_suffix != NULL ) { + dn = slapi_sdn_get_dn(sdn); roles_cache_trigger_update_role( slapi_ch_strdup(dn), entry, top_suffix, operation); diff --git a/ldap/servers/plugins/statechange/statechange.c b/ldap/servers/plugins/statechange/statechange.c index 3489fba..0653eed 100644 --- a/ldap/servers/plugins/statechange/statechange.c +++ b/ldap/servers/plugins/statechange/statechange.c @@ -232,7 +232,8 @@ static int statechange_post_op( Slapi_PBlock *pb, int modtype ) { SCNotify *notify = head; int execute; - char *dn = NULL; + Slapi_DN *sdn = NULL; + char *ndn = NULL; struct slapi_entry *e_before = NULL; struct slapi_entry *e_after = NULL;
@@ -246,13 +247,13 @@ static int statechange_post_op( Slapi_PBlock *pb, int modtype ) slapi_lock_mutex(buffer_lock); if(head) { - if(slapi_pblock_get( pb, SLAPI_TARGET_DN, &dn )) - { - slapi_log_error( SLAPI_LOG_FATAL, SCN_PLUGIN_SUBSYSTEM, "statechange_post_op: failed to get dn of changed entry"); + slapi_pblock_get( pb, SLAPI_TARGET_SDN, &sdn ); + if (NULL == sdn) { + slapi_log_error( SLAPI_LOG_FATAL, SCN_PLUGIN_SUBSYSTEM, + "statechange_post_op: failed to get dn of changed entry" ); goto bail; } - - slapi_dn_normalize( dn ); + ndn = (char *)slapi_sdn_get_ndn(sdn);
slapi_pblock_get( pb, SLAPI_ENTRY_PRE_OP, &e_before ); slapi_pblock_get( pb, SLAPI_ENTRY_POST_OP, &e_after ); @@ -264,7 +265,7 @@ static int statechange_post_op( Slapi_PBlock *pb, int modtype ) /* first dn */ if(notify->dn) { - if(0 != slapi_dn_issuffix(dn, notify->dn)) + if(0 != slapi_dn_issuffix(ndn, notify->dn)) execute = 1; } else @@ -290,9 +291,9 @@ static int statechange_post_op( Slapi_PBlock *pb, int modtype ) if(execute) { if(e_after) - (notify->func)(e_after, dn, modtype, pb, notify->caller_data); + (notify->func)(e_after, ndn, modtype, pb, notify->caller_data); else - (notify->func)(e_before, dn, modtype, pb, notify->caller_data); + (notify->func)(e_before, ndn, modtype, pb, notify->caller_data); }
notify = notify->next; diff --git a/ldap/servers/plugins/uiduniq/7bit.c b/ldap/servers/plugins/uiduniq/7bit.c index f6120d6..3e0b921 100644 --- a/ldap/servers/plugins/uiduniq/7bit.c +++ b/ldap/servers/plugins/uiduniq/7bit.c @@ -233,13 +233,14 @@ preop_add(Slapi_PBlock *pb) int argc; char **argv; char **attrName; - char *dn; + const char *dn; + Slapi_DN *sdn = NULL; Slapi_Entry *e; Slapi_Attr *attr; char **firstSubtree; char **subtreeDN; int subtreeCnt; - int is_replicated_operation; + int is_replicated_operation;
/* * Get the arguments @@ -263,9 +264,11 @@ preop_add(Slapi_PBlock *pb) /* * Get the target DN for this add operation */ - err = slapi_pblock_get(pb, SLAPI_ADD_TARGET, &dn); + err = slapi_pblock_get(pb, SLAPI_ADD_TARGET_SDN, &sdn); if (err) { result = op_error(50); break; }
+ dn = slapi_sdn_get_dn(sdn); + #ifdef DEBUG slapi_log_error(SLAPI_LOG_PLUGIN, plugin_name, "ADD target=%s\n", dn); #endif @@ -278,7 +281,7 @@ preop_add(Slapi_PBlock *pb) if (err) { result = op_error(51); break; }
for ( firstSubtree = argv; strcmp(*firstSubtree, ",") != 0; - firstSubtree++, argc--) {} + firstSubtree++, argc--) {} firstSubtree++; argc--;
@@ -304,7 +307,7 @@ preop_add(Slapi_PBlock *pb) * the target DN is a subnode in the tree. */ for( subtreeDN=firstSubtree, subtreeCnt=argc ;subtreeCnt > 0; - subtreeCnt--,subtreeDN++) + subtreeCnt--,subtreeDN++) { /* * issuffix determines whether the target is under the @@ -378,7 +381,8 @@ preop_modify(Slapi_PBlock *pb) LDAPMod **mods; LDAPMod **firstMods; LDAPMod *mod; - char *target; + const char *target; + Slapi_DN *target_sdn = NULL; char **firstSubtree; char **subtreeDN; int subtreeCnt; @@ -407,9 +411,10 @@ preop_modify(Slapi_PBlock *pb) if (err) { result = op_error(10); break; }
/* Get the target DN */ - err = slapi_pblock_get(pb, SLAPI_MODIFY_TARGET, &target); + err = slapi_pblock_get(pb, SLAPI_MODIFY_TARGET_SDN, &target_sdn); if (err) { result = op_error(11); break; }
+ target = slapi_sdn_get_dn(target_sdn); /* * Look for managed trees that include the target * Arguments before "," are the 7-bit clean attribute names. Arguemnts @@ -538,14 +543,14 @@ preop_modrdn(Slapi_PBlock *pb) int argc; char **argv; char **attrName; - char *target; - char *superior; + Slapi_DN *target_sdn = NULL; + Slapi_DN *superior; char *rdn; Slapi_Attr *attr; char **firstSubtree; char **subtreeDN; int subtreeCnt; - int is_replicated_operation; + int is_replicated_operation;
/* * Get the arguments @@ -567,11 +572,11 @@ preop_modrdn(Slapi_PBlock *pb) }
/* Get the DN of the entry being renamed */ - err = slapi_pblock_get(pb, SLAPI_MODRDN_TARGET, &target); + err = slapi_pblock_get(pb, SLAPI_MODRDN_TARGET_SDN, &target_sdn); if (err) { result = op_error(22); break; }
/* Get superior value - unimplemented in 3.0 DS */ - err = slapi_pblock_get(pb, SLAPI_MODRDN_NEWSUPERIOR, &superior); + err = slapi_pblock_get(pb, SLAPI_MODRDN_NEWSUPERIOR_SDN, &superior); if (err) { result = op_error(20); break; }
/* @@ -579,7 +584,7 @@ preop_modrdn(Slapi_PBlock *pb) * its current level in the tree. Use the target DN for * determining which managed tree this belongs to */ - if (!superior) superior = target; + if (!superior) superior = target_sdn;
/* Get the new RDN - this has the attribute values */ err = slapi_pblock_get(pb, SLAPI_MODRDN_NEWRDN, &rdn); @@ -649,7 +654,7 @@ preop_modrdn(Slapi_PBlock *pb) * issuffix determines whether the target is under the * subtree *subtreeDN */ - if (slapi_dn_issuffix(superior, *subtreeDN)) + if (slapi_dn_issuffix(slapi_sdn_get_dn(superior), *subtreeDN)) { #ifdef DEBUG slapi_log_error(SLAPI_LOG_PLUGIN, plugin_name, @@ -692,6 +697,7 @@ NS7bitAttr_Init(Slapi_PBlock *pb) int argc; char **argv;
+ /* Declare plugin version */ err = slapi_pblock_set(pb, SLAPI_PLUGIN_VERSION, SLAPI_PLUGIN_VERSION_01); @@ -716,8 +722,11 @@ NS7bitAttr_Init(Slapi_PBlock *pb) if (argc == 0) { err = -1; break; } argv++; argc--;
- for(;argc > 0;argc--, argv++) - slapi_dn_normalize_case(*argv); + for(;argc > 0;argc--, argv++) { + char *normdn = slapi_create_dn_string_case("%s", *argv); + slapi_ch_free_string(argv); + *argv = normdn; + }
/* Provide descriptive information */ err = slapi_pblock_set(pb, SLAPI_PLUGIN_DESCRIPTION, diff --git a/ldap/servers/plugins/uiduniq/uid.c b/ldap/servers/plugins/uiduniq/uid.c index 92eefa0..8bd5e17 100644 --- a/ldap/servers/plugins/uiduniq/uid.c +++ b/ldap/servers/plugins/uiduniq/uid.c @@ -340,28 +340,18 @@ search_one_berval(const char *baseDN, const char *attrName, */ for(;*entries;entries++) { - char *dn = slapi_entry_get_dn(*entries); - - /* - * DNs are returned in the original value used to insert - * the entry. This must be "normalized" for comparison. - * - * This normalization is done "in-place" (modifying the value - * in the entry). This is OK, since this is the only user - * of this copy of the entry. - */ - slapi_dn_normalize_case(dn); + char *ndn = slapi_entry_get_ndn(*entries); /* get the normalized dn */
#ifdef DEBUG slapi_log_error(SLAPI_LOG_PLUGIN, plugin_name, - "SEARCH entry dn=%s\n", dn); + "SEARCH entry dn=%s\n", ndn); #endif
/* * It is a Constraint Violation if any entry is found, unless * the entry is the target entry (if any). */ - if (!target || strcmp(dn, target) != 0) + if (!target || strcmp(ndn, target) != 0) { result = LDAP_CONSTRAINT_VIOLATION; break; @@ -557,7 +547,8 @@ preop_add(Slapi_PBlock *pb) int err; char *markerObjectClass = NULL; char *requiredObjectClass = NULL; - char *dn; + const char *dn = NULL; + Slapi_DN *sdn = NULL; int isupdatedn; Slapi_Entry *e; Slapi_Attr *attr; @@ -582,7 +573,7 @@ preop_add(Slapi_PBlock *pb) if (UNTAGGED_PARAMETER == result) { slapi_log_error(SLAPI_LOG_PLUGIN, plugin_name, - "ADD parameter untagged: %s\n", attrName); + "ADD parameter untagged: %s\n", attrName); result = LDAP_SUCCESS; /* Statically defined subtrees to monitor */ err = slapi_pblock_get(pb, SLAPI_PLUGIN_ARGC, &argc); @@ -599,9 +590,11 @@ preop_add(Slapi_PBlock *pb) /* * Get the target DN for this add operation */ - err = slapi_pblock_get(pb, SLAPI_ADD_TARGET, &dn); + err = slapi_pblock_get(pb, SLAPI_ADD_TARGET_SDN, &sdn); if (err) { result = uid_op_error(51); break; }
+ dn = slapi_sdn_get_dn(sdn); + #ifdef DEBUG slapi_log_error(SLAPI_LOG_PLUGIN, plugin_name, "ADD target=%s\n", dn); #endif @@ -636,7 +629,7 @@ preop_add(Slapi_PBlock *pb) if (NULL != markerObjectClass) { /* Subtree defined by location of marker object class */ - result = findSubtreeAndSearch(dn, attrName, attr, NULL, + result = findSubtreeAndSearch((char *)dn, attrName, attr, NULL, requiredObjectClass, dn, markerObjectClass); } else @@ -710,7 +703,8 @@ preop_modify(Slapi_PBlock *pb) int modcount = 0; int ii; LDAPMod *mod; - char *dn; + const char *dn = NULL; + Slapi_DN *sdn = NULL; int isupdatedn; int argc; char **argv = NULL; @@ -763,53 +757,57 @@ preop_modify(Slapi_PBlock *pb) /* find out how many mods meet this criteria */ for(;*mods;mods++) { - mod = *mods; - if ((slapi_attr_type_cmp(mod->mod_type, attrName, 1) == 0) && /* mod contains target attr */ - (mod->mod_op & LDAP_MOD_BVALUES) && /* mod is bval encoded (not string val) */ - (mod->mod_bvalues && mod->mod_bvalues[0]) && /* mod actually contains some values */ - (SLAPI_IS_MOD_ADD(mod->mod_op) || /* mod is add */ - SLAPI_IS_MOD_REPLACE(mod->mod_op))) /* mod is replace */ - { - addMod(&checkmods, &checkmodsCapacity, &modcount, mod); - } + mod = *mods; + if ((slapi_attr_type_cmp(mod->mod_type, attrName, 1) == 0) && /* mod contains target attr */ + (mod->mod_op & LDAP_MOD_BVALUES) && /* mod is bval encoded (not string val) */ + (mod->mod_bvalues && mod->mod_bvalues[0]) && /* mod actually contains some values */ + (SLAPI_IS_MOD_ADD(mod->mod_op) || /* mod is add */ + SLAPI_IS_MOD_REPLACE(mod->mod_op))) /* mod is replace */ + { + addMod(&checkmods, &checkmodsCapacity, &modcount, mod); + } } if (modcount == 0) { - break; /* no mods to check, we are done */ + break; /* no mods to check, we are done */ }
/* Get the target DN */ - err = slapi_pblock_get(pb, SLAPI_MODIFY_TARGET, &dn); + err = slapi_pblock_get(pb, SLAPI_MODIFY_TARGET_SDN, &sdn); if (err) { result = uid_op_error(11); break; }
- /* - * Check if it has the required object class - */ - if (requiredObjectClass && - !(spb = dnHasObjectClass(dn, requiredObjectClass))) { break; } + dn = slapi_sdn_get_dn(sdn); + /* + * Check if it has the required object class + */ + if (requiredObjectClass && + !(spb = dnHasObjectClass(dn, requiredObjectClass))) { + break; + }
- /* - * Passed all the requirements - this is an operation we - * need to enforce uniqueness on. Now find all parent entries - * with the marker object class, and do a search for each one. - */ - /* - * stop checking at first mod that fails the check - */ - for (ii = 0; (result == 0) && (ii < modcount); ++ii) - { - mod = checkmods[ii]; - if (NULL != markerObjectClass) - { - /* Subtree defined by location of marker object class */ - result = findSubtreeAndSearch(dn, attrName, NULL, mod->mod_bvalues, - requiredObjectClass, dn, markerObjectClass); - } else - { - /* Subtrees listed on invocation line */ - result = searchAllSubtrees(argc, argv, attrName, NULL, - mod->mod_bvalues, requiredObjectClass, dn); - } - } + /* + * Passed all the requirements - this is an operation we + * need to enforce uniqueness on. Now find all parent entries + * with the marker object class, and do a search for each one. + */ + /* + * stop checking at first mod that fails the check + */ + for (ii = 0; (result == 0) && (ii < modcount); ++ii) + { + mod = checkmods[ii]; + if (NULL != markerObjectClass) + { + /* Subtree defined by location of marker object class */ + result = findSubtreeAndSearch((char *)dn, attrName, NULL, + mod->mod_bvalues, requiredObjectClass, + dn, markerObjectClass); + } else + { + /* Subtrees listed on invocation line */ + result = searchAllSubtrees(argc, argv, attrName, NULL, + mod->mod_bvalues, requiredObjectClass, dn); + } + } END
slapi_ch_free((void **)&checkmods); @@ -846,7 +844,6 @@ preop_modrdn(Slapi_PBlock *pb) { int result = LDAP_SUCCESS; Slapi_Entry *e = NULL; - Slapi_DN *sdn = NULL; Slapi_Value *sv_requiredObjectClass = NULL; char *errtext = NULL; char *attrName = NULL; @@ -860,8 +857,9 @@ preop_modrdn(Slapi_PBlock *pb) int err; char *markerObjectClass=NULL; char *requiredObjectClass=NULL; - char *dn; - char *superior; + const char *dn = NULL; + Slapi_DN *sdn = NULL; + Slapi_DN *superior; char *rdn; int deloldrdn = 0; int isupdatedn; @@ -907,14 +905,13 @@ preop_modrdn(Slapi_PBlock *pb) }
/* Get the DN of the entry being renamed */ - err = slapi_pblock_get(pb, SLAPI_MODRDN_TARGET, &dn); + err = slapi_pblock_get(pb, SLAPI_MODRDN_TARGET_SDN, &sdn); if (err) { result = uid_op_error(31); break; }
- /* Create a Slapi_DN to use for searching. */ - sdn = slapi_sdn_new_dn_byref(dn); + dn = slapi_sdn_get_dn(sdn);
/* Get superior value - unimplemented in 3.0/4.0/5.0 DS */ - err = slapi_pblock_get(pb, SLAPI_MODRDN_NEWSUPERIOR, &superior); + err = slapi_pblock_get(pb, SLAPI_MODRDN_NEWSUPERIOR_SDN, &superior); if (err) { result = uid_op_error(32); break; }
/* @@ -922,7 +919,7 @@ preop_modrdn(Slapi_PBlock *pb) * its current level in the tree. Use the target DN for * determining which managed tree this belongs to */ - if (!superior) superior = dn; + if (!superior) superior = sdn;
/* Get the new RDN - this has the attribute values */ err = slapi_pblock_get(pb, SLAPI_MODRDN_NEWRDN, &rdn); @@ -949,7 +946,7 @@ preop_modrdn(Slapi_PBlock *pb) }
/* Apply the rename operation to the dummy entry. */ - err = slapi_entry_rename(e, rdn, deloldrdn, superior); + err = slapi_entry_rename(e, rdn, deloldrdn, slapi_sdn_get_dn(superior)); if (err != LDAP_SUCCESS) { result = uid_op_error(36); break; }
/* @@ -983,7 +980,6 @@ preop_modrdn(Slapi_PBlock *pb) } END /* Clean-up */ - slapi_sdn_free(&sdn); slapi_value_free(&sv_requiredObjectClass); if (e) slapi_entry_free(e);
@@ -1048,8 +1044,11 @@ NSUniqueAttr_Init(Slapi_PBlock *pb) if (argc < 1) { err = -1; break; } argv++; argc--;
- for(;argc > 0;argc--, argv++) - slapi_dn_normalize_case(*argv); + for(;argc > 0;argc--, argv++) { + char *normdn = slapi_create_dn_string_case("%s", *argv); + slapi_ch_free_string(argv); + *argv = normdn; + }
/* Provide descriptive information */ err = slapi_pblock_set(pb, SLAPI_PLUGIN_DESCRIPTION, diff --git a/ldap/servers/plugins/views/views.c b/ldap/servers/plugins/views/views.c index 6ec0246..48b6803 100644 --- a/ldap/servers/plugins/views/views.c +++ b/ldap/servers/plugins/views/views.c @@ -1683,6 +1683,7 @@ static int view_search_rewrite_callback(Slapi_PBlock *pb) int scope = 0; int set_scope = LDAP_SCOPE_SUBTREE; viewEntry *theView = 0; + Slapi_DN *basesdn = NULL;
#ifdef _VIEW_DEBUG_FILTERS char outFilter_str[1024]; @@ -1711,7 +1712,8 @@ static int view_search_rewrite_callback(Slapi_PBlock *pb) goto end;
/* if base of the search is a view */ - slapi_pblock_get(pb, SLAPI_SEARCH_TARGET, &base); + slapi_pblock_get(pb, SLAPI_SEARCH_TARGET_SDN, &basesdn); + base = (char *)slapi_sdn_get_dn(basesdn);
/* Read lock the cache */ views_read_lock(); @@ -1763,8 +1765,11 @@ static int view_search_rewrite_callback(Slapi_PBlock *pb) /* rewrite search scope and base*/ slapi_pblock_set(pb, SLAPI_SEARCH_SCOPE, &set_scope);
- base = slapi_ch_strdup(theView->pSearch_base); - slapi_pblock_set(pb, SLAPI_SEARCH_TARGET, base); + slapi_pblock_get(pb, SLAPI_SEARCH_TARGET_SDN, &basesdn); + slapi_sdn_free(&basesdn); + + basesdn = slapi_sdn_new_dn_byval(theView->pSearch_base); + slapi_pblock_set(pb, SLAPI_SEARCH_TARGET_SDN, basesdn);
/* concatenate the filters */ diff --git a/ldap/servers/slapd/add.c b/ldap/servers/slapd/add.c index 19a7690..cc712de 100644 --- a/ldap/servers/slapd/add.c +++ b/ldap/servers/slapd/add.c @@ -116,8 +116,7 @@ do_add( Slapi_PBlock *pb ) /* get the name */ { char *rawdn = NULL; - char *dn = NULL; - size_t dnlen = 0; + Slapi_DN mysdn; if ( ber_scanf( ber, "{a", &rawdn ) == LBER_ERROR ) { slapi_ch_free_string(&rawdn); LDAPDebug( LDAP_DEBUG_ANY, @@ -140,20 +139,20 @@ do_add( Slapi_PBlock *pb ) return; } } - rc = slapi_dn_normalize_ext(rawdn, 0, &dn, &dnlen); - if (rc < 0) { - op_shared_log_error_access(pb, "ADD", rawdn?rawdn:"", "invalid dn"); - send_ldap_result(pb, LDAP_INVALID_DN_SYNTAX, - NULL, "invalid dn", 0, NULL); - slapi_ch_free_string(&rawdn); + slapi_sdn_init_dn_passin(&mysdn, rawdn); + if (rawdn && (strlen(rawdn) > 0) && + (NULL == slapi_sdn_get_dn(&mysdn))) { + /* normalization failed */ + op_shared_log_error_access(pb, "ADD", rawdn, "invalid dn"); + send_ldap_result(pb, LDAP_INVALID_DN_SYNTAX, NULL, + "invalid dn", 0, NULL); + slapi_sdn_done(&mysdn); return; - } else if (rc > 0) { - slapi_ch_free_string(&rawdn); - } else { /* rc == 0; rawdn is passed in; not null terminated */ - *(dn + dnlen) = '\0'; } e = slapi_entry_alloc(); - slapi_entry_init(e,dn,NULL); /* Responsibility for DN is passed to the Entry. */ + /* Responsibility for DN is passed to the Entry. */ + slapi_entry_init_ext(e, &mysdn, NULL); + slapi_sdn_done(&mysdn); } LDAPDebug( LDAP_DEBUG_ARGS, " do_add: dn (%s)\n", slapi_entry_get_dn_const(e), 0, 0 );
@@ -338,7 +337,7 @@ slapi_add_entry_internal(Slapi_Entry *e, LDAPControl **controls, int dummy)
/* This is new style API to issue internal add operation. pblock should contain the following data (can be set via call to slapi_add_internal_set_pb): - SLAPI_TARGET_DN set to dn of the new entry + SLAPI_TARGET_SDN set to sdn of the new entry SLAPI_CONTROLS_ARG set to request controls if present SLAPI_ADD_ENTRY set to Slapi_Entry to add Beware: The entry is consumed. */ @@ -458,6 +457,7 @@ static void op_shared_add (Slapi_PBlock *pb) char *proxystr = NULL; int proxy_err = LDAP_SUCCESS; char *errtext = NULL; + Slapi_DN *sdn = NULL;
slapi_pblock_get (pb, SLAPI_OPERATION, &operation); slapi_pblock_get (pb, SLAPI_ADD_ENTRY, &e); @@ -532,7 +532,7 @@ static void op_shared_add (Slapi_PBlock *pb) goto done; } - slapi_pblock_set(pb, SLAPI_TARGET_DN, (void*)slapi_sdn_get_ndn(operation_get_target_spec (operation))); + slapi_pblock_set(pb, SLAPI_TARGET_SDN, (void*)operation_get_target_spec (operation)); send_referrals_from_entry(pb,referral); slapi_entry_free(referral); goto done; @@ -547,16 +547,16 @@ static void op_shared_add (Slapi_PBlock *pb) present_values= attr_get_present_values(attr);
/* Set the backend in the pblock. The slapi_access_allowed function - * needs this set to work properly. */ - slapi_pblock_set( pb, SLAPI_BACKEND, slapi_be_select( slapi_entry_get_sdn_const(e) ) ); + * needs this set to work properly. */ + slapi_pblock_set( pb, SLAPI_BACKEND, slapi_be_select( slapi_entry_get_sdn_const(e) ) );
/* Check ACI before checking password syntax */ if ( (err = slapi_access_allowed(pb, e, SLAPI_USERPWD_ATTR, NULL, - SLAPI_ACL_ADD)) != LDAP_SUCCESS) { - send_ldap_result(pb, err, NULL, - "Insufficient 'add' privilege to the " - "'userPassword' attribute", 0, NULL); - goto done; + SLAPI_ACL_ADD)) != LDAP_SUCCESS) { + send_ldap_result(pb, err, NULL, + "Insufficient 'add' privilege to the " + "'userPassword' attribute", 0, NULL); + goto done; }
/* check password syntax */ @@ -657,21 +657,23 @@ static void op_shared_add (Slapi_PBlock *pb) * plugins. */ - slapi_pblock_set(pb, SLAPI_ADD_TARGET, - (char*)slapi_sdn_get_ndn(slapi_entry_get_sdn_const(e))); - if (plugin_call_plugins(pb, internal_op ? SLAPI_PLUGIN_INTERNAL_PRE_ADD_FN : - SLAPI_PLUGIN_PRE_ADD_FN) == 0) + sdn = slapi_sdn_dup(slapi_entry_get_sdn_const(e)); + slapi_pblock_set(pb, SLAPI_ADD_TARGET_SDN, (void *)sdn); + if (plugin_call_plugins(pb, internal_op ? SLAPI_PLUGIN_INTERNAL_PRE_ADD_FN : + SLAPI_PLUGIN_PRE_ADD_FN) == 0) { int rc; Slapi_Entry *ec; - char *add_target_dn; + Slapi_DN *add_target_sdn = NULL;
slapi_pblock_set(pb, SLAPI_PLUGIN, be->be_database); set_db_default_result_handlers(pb); /* because be_add frees the entry */ ec = slapi_entry_dup(e); - add_target_dn= slapi_ch_strdup(slapi_sdn_get_ndn(slapi_entry_get_sdn_const(ec))); - slapi_pblock_set(pb, SLAPI_ADD_TARGET, add_target_dn); + add_target_sdn = slapi_sdn_dup(slapi_entry_get_sdn_const(ec)); + slapi_pblock_get(pb, SLAPI_ADD_TARGET_SDN, &sdn); + slapi_sdn_free(&sdn); + slapi_pblock_set(pb, SLAPI_ADD_TARGET_SDN, add_target_sdn); if (be->be_add != NULL) { @@ -717,9 +719,9 @@ static void op_shared_add (Slapi_PBlock *pb) plugin_call_plugins(pb, internal_op ? SLAPI_PLUGIN_INTERNAL_POST_ADD_FN : SLAPI_PLUGIN_POST_ADD_FN); slapi_entry_free(ec); - slapi_pblock_get(pb, SLAPI_ADD_TARGET, &add_target_dn); - slapi_ch_free((void**)&add_target_dn); } + slapi_pblock_get(pb, SLAPI_ADD_TARGET_SDN, &sdn); + slapi_sdn_free(&sdn);
done: if (be) diff --git a/ldap/servers/slapd/auditlog.c b/ldap/servers/slapd/auditlog.c index 3cca975..d000550 100644 --- a/ldap/servers/slapd/auditlog.c +++ b/ldap/servers/slapd/auditlog.c @@ -57,13 +57,14 @@ char *attr_deleteoldrdn = ATTR_DELETEOLDRDN; char *attr_modifiersname = ATTR_MODIFIERSNAME;
/* Forward Declarations */ -static void write_audit_file( int optype, char *dn, void *change, int flag, time_t curtime ); +static void write_audit_file( int optype, const char *dn, void *change, int flag, time_t curtime );
void write_audit_log_entry( Slapi_PBlock *pb ) { time_t curtime; - char *dn; + Slapi_DN *sdn; + const char *dn; void *change; int flag = 0; Operation *op; @@ -75,27 +76,13 @@ write_audit_log_entry( Slapi_PBlock *pb ) }
slapi_pblock_get( pb, SLAPI_OPERATION, &op ); - slapi_pblock_get( pb, SLAPI_TARGET_DN, &dn ); + slapi_pblock_get( pb, SLAPI_TARGET_SDN, &sdn ); + dn = slapi_sdn_get_dn(sdn); switch ( operation_get_type(op) ) { case SLAPI_OPERATION_MODIFY: slapi_pblock_get( pb, SLAPI_MODIFY_MODS, &change ); break; - case SLAPI_OPERATION_ADD: - { - /* - * For adds, we want the unnormalized dn, so we can preserve - * spacing, case, when replicating it. - */ - Slapi_Entry *te = NULL; - slapi_pblock_get( pb, SLAPI_ADD_ENTRY, &change ); - te = (Slapi_Entry *)change; - if ( NULL != te ) - { - dn = slapi_entry_get_dn( te ); - } - } - break; case SLAPI_OPERATION_DELETE: { char * deleterDN = NULL; @@ -129,7 +116,7 @@ write_audit_log_entry( Slapi_PBlock *pb ) static void write_audit_file( int optype, - char *dn, + const char *dn, void *change, int flag, time_t curtime diff --git a/ldap/servers/slapd/auth.c b/ldap/servers/slapd/auth.c index 2c25483..796ca7a 100644 --- a/ldap/servers/slapd/auth.c +++ b/ldap/servers/slapd/auth.c @@ -81,30 +81,17 @@ slapu_search_s( LDAP* ld, const char* rawbaseDN, int scope, const char* filter, int err = LDAP_NO_SUCH_OBJECT; Slapi_PBlock* pb = NULL; LDAPControl **ctrls; - char *baseDN = slapi_ch_strdup(rawbaseDN); - char *normDN = NULL; - size_t dnlen = 0; - - err = slapi_dn_normalize_ext(baseDN, 0, &normDN, &dnlen); - if (err < 0) { - err = LDAP_INVALID_DN_SYNTAX; - LDAPDebug (LDAP_DEBUG_TRACE, "<= slapu_search_s %i\n", err, 0, 0); - return err; - } else if (err == 0) { /* baseDN is passed in; not terminated */ - *(normDN + dnlen) = '\0'; - } else { - slapi_ch_free_string(&baseDN); - baseDN = normDN; - } + Slapi_DN *sdn = slapi_sdn_new_dn_byval(rawbaseDN); + char *baseDN = slapi_sdn_get_dn(sdn);
if (ld != internal_ld) { err = ldap_search_ext_s(ld, baseDN, scope, filter, attrs, attrsonly, NULL, NULL, NULL, -1, result); - slapi_ch_free_string(&baseDN); + slapi_sdn_free(&sdn); return err; } LDAPDebug (LDAP_DEBUG_TRACE, "=> slapu_search_s ("%s", %i, %s)\n", - baseDN, scope, filter); + baseDN, scope, filter); if (filter == NULL) filter = "objectclass=*";
/* use new internal search API */ @@ -138,7 +125,7 @@ slapu_search_s( LDAP* ld, const char* rawbaseDN, int scope, const char* filter, LDAPDebug (LDAP_DEBUG_ANY, "slapi_search_internal ("%s", %i, %s) NULL\n", escape_string( (char*)baseDN, ebuf ), scope, escape_string( (char*)filter, fbuf )); } - slapi_ch_free_string(&baseDN); + slapi_sdn_free(&sdn); *result = (LDAPMessage*)pb; LDAPDebug (LDAP_DEBUG_TRACE, "<= slapu_search_s %i\n", err, 0, 0); return err; @@ -534,19 +521,10 @@ handle_handshake_done (PRFileDesc *prfd, void* clientData)
if (clientDN != NULL) { char ebuf[ BUFSIZ ]; - int rc = 0; - char *normedDN = NULL; - size_t dnlen = 0; - - rc = slapi_dn_normalize_ext(clientDN, 0, &normedDN, &dnlen); - if (rc < 0) { - /* ignoring the normalization error, use the pre normalized DN */ - } else if (rc == 0) { /* clientDN is passed in; not terminated */ - *(normedDN + dnlen) = '\0'; - } else { - slapi_ch_free_string(&clientDN); - clientDN = normedDN; - } + Slapi_DN *sdn = NULL; + sdn = slapi_sdn_new_dn_passin(clientDN); + clientDN = slapi_ch_strdup(slapi_sdn_get_dn(sdn)); + slapi_sdn_free(&sdn); slapi_log_access (LDAP_DEBUG_STATS, "conn=%" NSPRIu64 " SSL client bound as %s\n", conn->c_connid, escape_string( clientDN, ebuf )); diff --git a/ldap/servers/slapd/back-ldbm/ancestorid.c b/ldap/servers/slapd/back-ldbm/ancestorid.c index 1e90871..15fb7e0 100644 --- a/ldap/servers/slapd/back-ldbm/ancestorid.c +++ b/ldap/servers/slapd/back-ldbm/ancestorid.c @@ -717,8 +717,8 @@ static int ldbm_ancestorid_index_update( { DB *db = NULL; int allids = IDL_INSERT_NORMAL; - Slapi_DN dn = {0}; - Slapi_DN nextdn = {0}; + Slapi_DN sdn; + Slapi_DN nextsdn; struct attrinfo *ai = NULL; ID node_id, sub_id; idl_iterator iter; @@ -733,36 +733,38 @@ static int ldbm_ancestorid_index_update( goto out; }
- slapi_sdn_copy(low, &dn); + slapi_sdn_init(&sdn); + slapi_sdn_init(&nextsdn); + slapi_sdn_copy(low, &sdn);
if (include_low == 0) { - if (slapi_sdn_compare(&dn, high) == 0) { + if (slapi_sdn_compare(&sdn, high) == 0) { goto out; } /* Get the next highest DN */ - slapi_sdn_get_parent(&dn, &nextdn); - slapi_sdn_copy(&nextdn, &dn); + slapi_sdn_get_parent(&sdn, &nextsdn); + slapi_sdn_copy(&nextsdn, &sdn); }
/* Iterate up through the tree */ do { - if (slapi_sdn_isempty(&dn)) { + if (slapi_sdn_isempty(&sdn)) { break; }
/* Have we reached the high node? */ - if (include_high == 0 && slapi_sdn_compare(&dn, high) == 0) { + if (include_high == 0 && slapi_sdn_compare(&sdn, high) == 0) { break; }
/* Get the id for that DN */ if (entryrdn_get_switch()) { /* subtree-rename: on */ node_id = 0; - err = entryrdn_index_read(be, &dn, &node_id, txn); + err = entryrdn_index_read(be, &sdn, &node_id, txn); if (err) { if (DB_NOTFOUND != err) { ldbm_nasty(sourcefile,13141,err); - LDAPDebug1Arg(LDAP_DEBUG_ANY, "entryrdn_index_read(%s)\n", slapi_sdn_get_dn(&dn)); + LDAPDebug1Arg(LDAP_DEBUG_ANY, "entryrdn_index_read(%s)\n", slapi_sdn_get_dn(&sdn)); ret = err; } break; @@ -770,8 +772,8 @@ static int ldbm_ancestorid_index_update( } else { IDList *idl = NULL; struct berval ndnv; - ndnv.bv_val = (void*)slapi_sdn_get_ndn(&dn); - ndnv.bv_len = slapi_sdn_get_ndn_len(&dn); + ndnv.bv_val = (void*)slapi_sdn_get_ndn(&sdn); + ndnv.bv_len = slapi_sdn_get_ndn_len(&sdn); err = 0; idl = index_read(be, LDBM_ENTRYDN_STR, indextype_EQUALITY, &ndnv, txn, &err); if (idl == NULL) { @@ -807,19 +809,19 @@ static int ldbm_ancestorid_index_update( }
/* Have we reached the high node? */ - if (slapi_sdn_compare(&dn, high) == 0) { + if (slapi_sdn_compare(&sdn, high) == 0) { break; }
/* Get the next highest DN */ - slapi_sdn_get_parent(&dn, &nextdn); - slapi_sdn_copy(&nextdn, &dn); + slapi_sdn_get_parent(&sdn, &nextsdn); + slapi_sdn_copy(&nextsdn, &sdn);
} while (ret == 0);
out: - slapi_sdn_done(&dn); - slapi_sdn_done(&nextdn); + slapi_sdn_done(&sdn); + slapi_sdn_done(&nextsdn);
/* Release the ancestorid file */ if (db != NULL) { @@ -856,7 +858,8 @@ int ldbm_ancestorid_index_entry( * If common is non-null then the common suffix of left and right * is returned in *common. */ -int slapi_sdn_suffix_cmp( +static int +_sdn_suffix_cmp( const Slapi_DN *left, const Slapi_DN *right, Slapi_DN *common @@ -870,12 +873,24 @@ int slapi_sdn_suffix_cmp( rdns1 = slapi_ldap_explode_dn(slapi_sdn_get_ndn(left), 0); rdns2 = slapi_ldap_explode_dn(slapi_sdn_get_ndn(right), 0);
- for(count1 = 0; rdns1[count1]!=NULL; count1++){ + if (NULL == rdns1) { + if (NULL == rdns2) { + ret = 0; + } else { + ret = 1; + } + goto out; + } else { + if (NULL == rdns2) { + ret = -1; + goto out; + } } + + for(count1 = 0; rdns1[count1]!=NULL; count1++) ; count1--;
- for(count2 = 0; rdns2[count2]!=NULL; count2++){ - } + for(count2 = 0; rdns2[count2]!=NULL; count2++) ; count2--;
while (count1 >= 0 && count2 >= 0) { @@ -922,11 +937,11 @@ int slapi_sdn_suffix_cmp( LDAPDebug(LDAP_DEBUG_TRACE, "common suffix <%s>\n", slapi_sdn_get_dn(common), 0, 0);
- out: +out: slapi_ldap_value_free(rdns1); slapi_ldap_value_free(rdns2);
- LDAPDebug(LDAP_DEBUG_TRACE, "slapi_sdn_suffix_cmp(<%s>, <%s>) => %d\n", + LDAPDebug(LDAP_DEBUG_TRACE, "_sdn_suffix_cmp(<%s>, <%s>) => %d\n", slapi_sdn_get_dn(left), slapi_sdn_get_dn(right), ret);
return ret; @@ -942,15 +957,17 @@ int ldbm_ancestorid_move_subtree( ) { int ret = 0; - Slapi_DN commondn = {0}; + Slapi_DN commonsdn; +
+ slapi_sdn_init(&commonsdn); /* Determine the common ancestor */ - (void)slapi_sdn_suffix_cmp(olddn, newdn, &commondn); + (void)_sdn_suffix_cmp(olddn, newdn, &commonsdn);
/* Delete from old ancestors */ ret = ldbm_ancestorid_index_update(be, olddn, - &commondn, + &commonsdn, 0, 0, id, @@ -962,7 +979,7 @@ int ldbm_ancestorid_move_subtree( /* Add to new ancestors */ ret = ldbm_ancestorid_index_update(be, newdn, - &commondn, + &commonsdn, 0, 0, id, @@ -971,7 +988,7 @@ int ldbm_ancestorid_move_subtree( txn);
out: - slapi_sdn_done(&commondn); + slapi_sdn_done(&commonsdn); return ret; }
diff --git a/ldap/servers/slapd/back-ldbm/dblayer.c b/ldap/servers/slapd/back-ldbm/dblayer.c index 0e5804c..7f7d0ca 100644 --- a/ldap/servers/slapd/back-ldbm/dblayer.c +++ b/ldap/servers/slapd/back-ldbm/dblayer.c @@ -2815,7 +2815,6 @@ int dblayer_remove_env(struct ldbminfo *li) { DB_ENV *env = NULL; - dblayer_private *priv = NULL; char *home_dir = NULL; int rc = db_env_create(&env, 0); if (rc) { @@ -2827,7 +2826,6 @@ dblayer_remove_env(struct ldbminfo *li) LDAPDebug0Args(LDAP_DEBUG_ANY, "ERROR -- No ldbm info is given\n"); return -1; } - priv = (dblayer_private *)li->li_dblayer_private;
home_dir = dblayer_get_home_dir(li, NULL); if (home_dir) { diff --git a/ldap/servers/slapd/back-ldbm/dn2entry.c b/ldap/servers/slapd/back-ldbm/dn2entry.c index 4d6dc7c..99a9f47 100644 --- a/ldap/servers/slapd/back-ldbm/dn2entry.c +++ b/ldap/servers/slapd/back-ldbm/dn2entry.c @@ -182,13 +182,11 @@ dn2ancestor( Slapi_DN ancestorndn; const char *ptr;
- /* assign ancestordn to the parent of the given dn - ancestordn will contain - the "raw" unnormalized DN from the caller, so we can give back the DN - in the same format as we received it */ + /* assign ancestordn to the parent of the given dn */ ptr = slapi_dn_find_parent(slapi_sdn_get_dn(sdn)); /* assign the ancestordn dn pointer to the parent of dn from sdn - sdn "owns" the memory, but ancestordn points to it */ - slapi_sdn_set_dn_byref(ancestordn, ptr); /* free any previous contents */ + slapi_sdn_set_normdn_byref(ancestordn, ptr); /* free any previous contents */ /* now, do the same for the normalized version */ /* ancestorndn holds the normalized version for iteration purposes and because dn2entry needs the normalized dn */ @@ -221,7 +219,7 @@ dn2ancestor( slapi_sdn_set_ndn_byref(&ancestorndn, ptr); /* wipe out the previous contents */ /* now do the same for the unnormalized one */ ptr = slapi_dn_find_parent(slapi_sdn_get_dn(ancestordn)); - slapi_sdn_set_dn_byref(ancestordn, ptr); /* wipe out the previous contents */ + slapi_sdn_set_normdn_byref(ancestordn, ptr); /* wipe out the previous contents */ } }
@@ -256,17 +254,20 @@ get_copy_of_entry(Slapi_PBlock *pb, const entry_address *addr, back_txn *txn, in } else { - Slapi_DN sdn; - slapi_sdn_init_dn_byref (&sdn, addr->dn); /* We assume that the DN is not normalized */ - entry = dn2entry( be, &sdn, txn, &err ); - slapi_sdn_done (&sdn); + if (addr->sdn) { + entry = dn2entry( be, addr->sdn, txn, &err ); + } else { + err = 1; + } } if ( 0 != err && DB_NOTFOUND != err ) { if(must_exist) { - LDAPDebug( LDAP_DEBUG_ANY, "Operation error fetching %s (%s), error %d.\n", - addr->dn, (addr->uniqueid==NULL?"null":addr->uniqueid), err ); + LDAPDebug( LDAP_DEBUG_ANY, + "Operation error fetching %s (%s), error %d.\n", + addr->sdn?slapi_sdn_get_dn(addr->sdn):"Null DN", + (addr->uniqueid==NULL?"null":addr->uniqueid), err ); } if ( LDAP_INVALID_DN_SYNTAX == err ) { rc = LDAP_INVALID_DN_SYNTAX; /* respect the error */ @@ -280,9 +281,9 @@ get_copy_of_entry(Slapi_PBlock *pb, const entry_address *addr, back_txn *txn, in if(entry!=NULL) { ldbm_instance *inst; - slapi_pblock_set( pb, plock_parameter, slapi_entry_dup(entry->ep_entry)); + slapi_pblock_set( pb, plock_parameter, slapi_entry_dup(entry->ep_entry)); inst = (ldbm_instance *) be->be_instance_info; - CACHE_RETURN( &inst->inst_cache, &entry ); + CACHE_RETURN( &inst->inst_cache, &entry ); } } /* JCMREPL - Free the backentry? */ diff --git a/ldap/servers/slapd/back-ldbm/findentry.c b/ldap/servers/slapd/back-ldbm/findentry.c index 9c076f8..b739ab1 100644 --- a/ldap/servers/slapd/back-ldbm/findentry.c +++ b/ldap/servers/slapd/back-ldbm/findentry.c @@ -170,14 +170,15 @@ find_entry_internal_dn( */ if (!really_internal) { struct backentry *me; - Slapi_DN ancestordn= {0}; - me= dn2ancestor(pb->pb_backend,sdn,&ancestordn,txn,&err); + Slapi_DN ancestorsdn; + slapi_sdn_init(&ancestorsdn); + me= dn2ancestor(pb->pb_backend,sdn,&ancestorsdn,txn,&err); if ( !managedsait && me != NULL ) { /* if the entry is a referral send the referral */ - if(check_entry_for_referral(pb, me->ep_entry, (char*)slapi_sdn_get_dn(&ancestordn), "find_entry_internal_dn")) + if(check_entry_for_referral(pb, me->ep_entry, (char*)slapi_sdn_get_dn(&ancestorsdn), "find_entry_internal_dn")) { CACHE_RETURN( &inst->inst_cache, &me ); - slapi_sdn_done(&ancestordn); + slapi_sdn_done(&ancestorsdn); return( NULL ); } /* else fall through to no such object */ @@ -187,8 +188,8 @@ find_entry_internal_dn( slapi_send_ldap_result( pb, ( 0 == err || DB_NOTFOUND == err ) ? LDAP_NO_SUCH_OBJECT : ( LDAP_INVALID_DN_SYNTAX == err ) ? LDAP_INVALID_DN_SYNTAX : LDAP_OPERATIONS_ERROR, - (char*)slapi_sdn_get_dn(&ancestordn), NULL, 0, NULL ); - slapi_sdn_done(&ancestordn); + (char*)slapi_sdn_get_dn(&ancestorsdn), NULL, 0, NULL ); + slapi_sdn_done(&ancestorsdn); CACHE_RETURN( &inst->inst_cache, &me ); }
@@ -276,17 +277,21 @@ find_entry_internal( } else { - Slapi_DN sdn; - struct backentry *entry; + struct backentry *entry = NULL;
- slapi_sdn_init_dn_ndn_byref (&sdn, addr->dn); /* normalized by front end */ LDAPDebug( LDAP_DEBUG_TRACE, "=> find_entry_internal (dn=%s) lock %d\n", - addr->dn, lock, 0 ); - entry = find_entry_internal_dn (pb, be, &sdn, lock, txn, really_internal); - slapi_sdn_done (&sdn); + slapi_sdn_get_dn(addr->sdn), lock, 0 ); + if (addr->sdn) { + entry = find_entry_internal_dn (pb, be, addr->sdn, + lock, txn, really_internal); + } else { + LDAPDebug0Args( LDAP_DEBUG_ANY, + "find_entry_internal: Null target dn\n" ); + } + + LDAPDebug0Args( LDAP_DEBUG_TRACE, "<= find_entry_internal\n" ); return entry; } - }
struct backentry * diff --git a/ldap/servers/slapd/back-ldbm/id2entry.c b/ldap/servers/slapd/back-ldbm/id2entry.c index 12e2951..bd51a7f 100644 --- a/ldap/servers/slapd/back-ldbm/id2entry.c +++ b/ldap/servers/slapd/back-ldbm/id2entry.c @@ -358,40 +358,40 @@ id2entry( backend *be, ID id, back_txn *txn, int *err ) /* data.dptr may not include rdn: ..., try "dn: ..." */ ee = slapi_str2entry( data.dptr, SLAPI_STR2ENTRY_NO_ENTRYDN ); } else { - char *dn = NULL; + char *normdn = NULL; struct backdn *bdn = dncache_find_id(&inst->inst_dncache, id); if (bdn) { - dn = slapi_ch_strdup(slapi_sdn_get_dn(bdn->dn_sdn)); + normdn = slapi_ch_strdup(slapi_sdn_get_dn(bdn->dn_sdn)); slapi_log_error(SLAPI_LOG_CACHE, ID2ENTRY, - "dncache_find_id returned: %s\n", dn); + "dncache_find_id returned: %s\n", normdn); CACHE_RETURN(&inst->inst_dncache, &bdn); } else { Slapi_DN *sdn = NULL; - rc = entryrdn_lookup_dn(be, rdn, id, &dn, txn); + rc = entryrdn_lookup_dn(be, rdn, id, &normdn, txn); if (rc) { slapi_log_error(SLAPI_LOG_TRACE, ID2ENTRY, "id2entry: entryrdn look up failed " "(rdn=%s, ID=%d)\n", rdn, id); /* Try rdn as dn. Could be RUV. */ - dn = slapi_ch_strdup(rdn); + normdn = slapi_ch_strdup(rdn); } - sdn = slapi_sdn_new_dn_byval((const char *)dn); + sdn = slapi_sdn_new_normdn_byval((const char *)normdn); bdn = backdn_init(sdn, id, 0); if (CACHE_ADD( &inst->inst_dncache, bdn, NULL )) { backdn_free(&bdn); slapi_log_error(SLAPI_LOG_CACHE, ID2ENTRY, - "%s is already in the dn cache\n", dn); + "%s is already in the dn cache\n", normdn); } else { CACHE_RETURN(&inst->inst_dncache, &bdn); slapi_log_error(SLAPI_LOG_CACHE, ID2ENTRY, "entryrdn_lookup_dn returned: %s, " - "and set to dn cache (id %d)\n", dn, id); + "and set to dn cache (id %d)\n", normdn, id); } } - ee = slapi_str2entry_ext( (const char *)dn, data.dptr, + ee = slapi_str2entry_ext( (const char *)normdn, data.dptr, SLAPI_STR2ENTRY_NO_ENTRYDN ); slapi_ch_free_string(&rdn); - slapi_ch_free_string(&dn); + slapi_ch_free_string(&normdn); } } else { ee = slapi_str2entry( data.dptr, 0 ); diff --git a/ldap/servers/slapd/back-ldbm/idl_common.c b/ldap/servers/slapd/back-ldbm/idl_common.c index 593a036..f04f8de 100644 --- a/ldap/servers/slapd/back-ldbm/idl_common.c +++ b/ldap/servers/slapd/back-ldbm/idl_common.c @@ -133,7 +133,7 @@ idl_append_extend(IDList **orig_idl, ID id) IDList *idl = *orig_idl;
if (idl == NULL) { - idl = idl_alloc(1); + idl = idl_alloc(32); /* used to be 0 */ idl_append(idl, id);
*orig_idl = idl; @@ -151,9 +151,7 @@ idl_append_extend(IDList **orig_idl, ID id) } /* copy over the existing contents */ idl_new->b_nids = idl->b_nids; - for (x = 0; x < idl->b_nids;x++) { - idl_new->b_ids[x] = idl->b_ids[x]; - } + memcpy(idl_new->b_ids, idl->b_ids, sizeof(ID) * idl->b_nids); idl_free(idl); idl = idl_new; } diff --git a/ldap/servers/slapd/back-ldbm/import-threads.c b/ldap/servers/slapd/back-ldbm/import-threads.c index 207c470..e95d32f 100644 --- a/ldap/servers/slapd/back-ldbm/import-threads.c +++ b/ldap/servers/slapd/back-ldbm/import-threads.c @@ -521,6 +521,7 @@ import_producer(void *param) if (!(str2entry_flags & SLAPI_STR2ENTRY_INCLUDE_VERSION_STR) && entryrdn_get_switch()) { /* subtree-rename: on */ char *dn = NULL; + char *normdn = NULL; int rc = 0; /* estr should start with "dn: " or "dn:: " */ if (strncmp(estr, "dn: ", 4) && NULL == strstr(estr, "\ndn: ") && /* in case comments precedes @@ -541,8 +542,11 @@ import_producer(void *param) FREE(estr); continue; } - e = slapi_str2entry_ext(dn, estr, flags|SLAPI_STR2ENTRY_NO_ENTRYDN); + normdn = slapi_create_dn_string("%s", dn); slapi_ch_free_string(&dn); + e = slapi_str2entry_ext(normdn, estr, + flags|SLAPI_STR2ENTRY_NO_ENTRYDN); + slapi_ch_free_string(&normdn); } else { e = slapi_str2entry(estr, flags); } @@ -1038,16 +1042,16 @@ index_producer(void *param) } } } else { - char *dn = NULL; + char *normdn = NULL; struct backdn *bdn = dncache_find_id(&inst->inst_dncache, temp_id); if (bdn) { /* don't free dn */ - dn = (char *)slapi_sdn_get_dn(bdn->dn_sdn); + normdn = (char *)slapi_sdn_get_dn(bdn->dn_sdn); CACHE_RETURN(&inst->inst_dncache, &bdn); } else { Slapi_DN *sdn = NULL; - rc = entryrdn_lookup_dn(be, rdn, temp_id, &dn, NULL); + rc = entryrdn_lookup_dn(be, rdn, temp_id, &normdn, NULL); if (rc) { /* We cannot use the entryrdn index; * Compose dn from the entries in id2entry */ @@ -1090,21 +1094,21 @@ index_producer(void *param) continue; } } - dn = slapi_ch_smprintf("%s%s%s", + normdn = slapi_ch_smprintf("%s%s%s", rdn, pdn?",":"", pdn?pdn:""); slapi_ch_free_string(&pdn); } /* dn is not dup'ed in slapi_sdn_new_dn_byref. * It's set to bdn and put in the dn cache. */ - sdn = slapi_sdn_new_dn_byref(dn); + sdn = slapi_sdn_new_normdn_byref(normdn); bdn = backdn_init(sdn, temp_id, 0); CACHE_ADD( &inst->inst_dncache, bdn, NULL ); CACHE_RETURN(&inst->inst_dncache, &bdn); slapi_log_error(SLAPI_LOG_CACHE, "ldbm2index", "entryrdn_lookup_dn returned: %s, " - "and set to dn cache\n", dn); + "and set to dn cache\n", normdn); } - e = slapi_str2entry_ext(dn, data.dptr, + e = slapi_str2entry_ext(normdn, data.dptr, SLAPI_STR2ENTRY_NO_ENTRYDN); slapi_ch_free_string(&rdn); } @@ -1283,7 +1287,7 @@ upgradedn_producer(void *param) struct upgradedn_attr *ud_ptr = NULL; Slapi_Attr *ud_attr = NULL; char *ecopy = NULL; - char *dn = NULL; + const char *normdn = NULL;
/* vars for Berkeley DB */ DB_ENV *env = NULL; @@ -1384,7 +1388,7 @@ upgradedn_producer(void *param) ecopy = (char *)slapi_ch_malloc(data.dsize + 1); memcpy(ecopy, data.dptr, data.dsize); *(ecopy + data.dsize) = '\0'; - dn = NULL; + normdn = NULL; doit = 0; if (entryrdn_get_switch()) { char *rdn = NULL; @@ -1400,10 +1404,11 @@ upgradedn_producer(void *param) dncache_find_id(&inst->inst_dncache, temp_id); if (bdn) { /* don't free dn */ - dn = (char *)slapi_sdn_get_dn(bdn->dn_sdn); + normdn = (char *)slapi_sdn_get_dn(bdn->dn_sdn); CACHE_RETURN(&inst->inst_dncache, &bdn); } else { - rc = entryrdn_lookup_dn(be, rdn, temp_id, &dn, NULL); + rc = entryrdn_lookup_dn(be, rdn, temp_id, + (char **)&normdn, NULL); if (rc) { /* We cannot use the entryrdn index; * Compose dn from the entries in id2entry */ @@ -1446,21 +1451,21 @@ upgradedn_producer(void *param) continue; } } - dn = slapi_ch_smprintf("%s%s%s", + normdn = slapi_ch_smprintf("%s%s%s", rdn, pdn?",":"", pdn?pdn:""); slapi_ch_free_string(&pdn); } /* dn is not dup'ed in slapi_sdn_new_dn_byref. * It's set to bdn and put in the dn cache. */ - sdn = slapi_sdn_new_dn_byref(dn); + sdn = slapi_sdn_new_normdn_byref(normdn); bdn = backdn_init(sdn, temp_id, 0); CACHE_ADD( &inst->inst_dncache, bdn, NULL ); CACHE_RETURN(&inst->inst_dncache, &bdn); slapi_log_error(SLAPI_LOG_CACHE, "ldbm2index", "entryrdn_lookup_dn returned: %s, " - "and set to dn cache\n", dn); + "and set to dn cache\n", normdn); } - e = slapi_str2entry_ext(dn, data.dptr, + e = slapi_str2entry_ext(normdn, data.dptr, SLAPI_STR2ENTRY_USE_OBSOLETE_DNFORMAT); slapi_ch_free_string(&rdn); } @@ -1485,23 +1490,13 @@ upgradedn_producer(void *param) * SLAPI_STR2ENTRY_USE_OBSOLETE_DNFORMAT * -- normalize it with the new format */ - if (!dn) { - get_value_from_string((const char *)ecopy, "dn", &dn); + if (!normdn) { + get_value_from_string((const char *)ecopy, "dn", (char **)&normdn); } - if (dn) { - char *dest = NULL; - size_t dest_len = 0; - - rc = slapi_dn_normalize_ext(dn, strlen(dn), &dest, &dest_len); - if (rc > 0) { - slapi_ch_free_string(&dn); - dn = dest; - } else { - *(dn + dest_len) = '\0'; /* src is passed in; - it's possible dn_len < dest_len */ - } + if (normdn) { slapi_sdn_done(&(e->e_sdn)); - slapi_sdn_init_dn_passin(&(e->e_sdn), dn); + slapi_sdn_init_dn_passin(&(e->e_sdn), normdn); + normdn = slapi_sdn_get_dn(&(e->e_sdn)); }
/* From here, e != NULL */ @@ -1559,7 +1554,7 @@ upgradedn_producer(void *param) if (rc) { LDAPDebug(LDAP_DEBUG_ANY, "%s: Failed to add rdn values " "to an entry: %s (id %lu)\n", - inst->inst_name, dn, (u_long)temp_id); + inst->inst_name, normdn, (u_long)temp_id); slapi_entry_free(e); e = NULL; continue; } @@ -1636,7 +1631,7 @@ upgradedn_producer(void *param) LDAPDebug(LDAP_DEBUG_ANY, "%s: Failed to add rdn values " "to an entry: %s (id %lu)\n", - inst->inst_name, dn, (u_long)temp_id); + inst->inst_name, normdn, (u_long)temp_id); slapi_entry_free(e); e = NULL; continue; } @@ -2251,12 +2246,11 @@ import_foreman(void *param) char *new_dn = NULL; char *orig_dn = slapi_ch_strdup(slapi_entry_get_dn(fi->entry->ep_entry)); - int rc = 0; nsuniqueid = attrlist_find(fi->entry->ep_entry->e_attrs, "nsuniqueid"); if (nsuniqueid) { Slapi_Value *uival = NULL; - rc = slapi_attr_first_value(nsuniqueid, &uival); + slapi_attr_first_value(nsuniqueid, &uival); uuidstr = slapi_value_get_string(uival); } else { import_log_notice(job, "ERROR: Failed to get nsUniqueId " @@ -3453,9 +3447,8 @@ import_get_and_add_parent_rdns(ImportWorkerInfo *info, { int rc = -1; struct backdn *bdn = NULL; - struct ldbminfo *li = NULL; Slapi_Entry *e = NULL; - char *dn = NULL; + char *normdn = NULL;
if (!entryrdn_get_switch()) { /* entryrdn specific function */ return rc; @@ -3466,7 +3459,6 @@ import_get_and_add_parent_rdns(ImportWorkerInfo *info, NULL==inst?"inst":"srdn"); return rc; } - li = inst->inst_li;
/* first, try the dn cache */ bdn = dncache_find_id(&inst->inst_dncache, id); @@ -3563,8 +3555,8 @@ import_get_and_add_parent_rdns(ImportWorkerInfo *info, } }
- dn = NULL; - rc = slapi_rdn_get_dn(&mysrdn, &dn); + normdn = NULL; + rc = slapi_rdn_get_dn(&mysrdn, &normdn); if (rc) { LDAPDebug2Args( LDAP_DEBUG_ANY, "import_get_and_add_parent_rdns: " @@ -3572,7 +3564,7 @@ import_get_and_add_parent_rdns(ImportWorkerInfo *info, "from Slapi_RDN\n", rdn, id); goto bail; } - e = slapi_str2entry_ext(dn, data.dptr, SLAPI_STR2ENTRY_NO_ENTRYDN); + e = slapi_str2entry_ext(normdn, data.dptr, SLAPI_STR2ENTRY_NO_ENTRYDN); (*curr_entry)++; rc = index_set_entry_to_fifo(info, e, id, total_id, *curr_entry); if (rc) { diff --git a/ldap/servers/slapd/back-ldbm/index.c b/ldap/servers/slapd/back-ldbm/index.c index c8be27a..08218ad 100644 --- a/ldap/servers/slapd/back-ldbm/index.c +++ b/ldap/servers/slapd/back-ldbm/index.c @@ -874,7 +874,7 @@ index_read_ext_allids( (0 == PL_strcasecmp(basetype, LDBM_ENTRYDN_STR))) { int rc = 0; ID id = 0; - Slapi_DN sdn = {0}; + Slapi_DN sdn;
/* We don't need these values... */ index_free_prefix( prefix ); diff --git a/ldap/servers/slapd/back-ldbm/instance.c b/ldap/servers/slapd/back-ldbm/instance.c index 74a01a8..0217e96 100644 --- a/ldap/servers/slapd/back-ldbm/instance.c +++ b/ldap/servers/slapd/back-ldbm/instance.c @@ -141,6 +141,7 @@ int ldbm_instance_create(backend *be, char *name) goto done;
error: + slapi_ch_free_string(&inst->inst_name); slapi_ch_free((void**)&inst);
done: diff --git a/ldap/servers/slapd/back-ldbm/ldbm_add.c b/ldap/servers/slapd/back-ldbm/ldbm_add.c index 5ade337..0fd612b 100644 --- a/ldap/servers/slapd/back-ldbm/ldbm_add.c +++ b/ldap/servers/slapd/back-ldbm/ldbm_add.c @@ -79,7 +79,7 @@ ldbm_back_add( Slapi_PBlock *pb ) backend *be; struct ldbminfo *li; ldbm_instance *inst; - char *dn = NULL; + const char *dn = NULL; Slapi_Entry *e = NULL; struct backentry *tombstoneentry = NULL; struct backentry *addingentry = NULL; @@ -105,7 +105,7 @@ ldbm_back_add( Slapi_PBlock *pb ) int addingentry_id_assigned= 0; int addingentry_in_cache= 0; int tombstone_in_cache= 0; - Slapi_DN sdn; + Slapi_DN *sdn = NULL; Slapi_DN parentsdn; Slapi_Operation *operation; int dblock_acquired= 0; @@ -134,7 +134,6 @@ ldbm_back_add( Slapi_PBlock *pb ) inst = (ldbm_instance *) be->be_instance_info; /* sdn & parentsdn need to be initialized before "goto *_return" */ - slapi_sdn_init(&sdn); slapi_sdn_init(&parentsdn); /* Get rid of ldbm backend attributes that you are not allowed to specify yourself */ @@ -195,17 +194,21 @@ ldbm_back_add( Slapi_PBlock *pb ) { /* Check if an entry with the intended uniqueid already exists. */ done_with_pblock_entry(pb,SLAPI_ADD_EXISTING_UNIQUEID_ENTRY); /* Could be through this multiple times */ - addr.dn = addr.udn = NULL; + addr.udn = NULL; + addr.sdn = NULL; addr.uniqueid = (char*)slapi_entry_get_uniqueid(e); /* jcm - cast away const */ ldap_result_code= get_copy_of_entry(pb, &addr, &txn, SLAPI_ADD_EXISTING_UNIQUEID_ENTRY, !is_replicated_operation); } if(slapi_isbitset_int(rc,SLAPI_RTN_BIT_FETCH_EXISTING_DN_ENTRY)) { - slapi_pblock_get( pb, SLAPI_ADD_TARGET, &dn ); - if (NULL == dn) + slapi_pblock_get( pb, SLAPI_ADD_TARGET_SDN, &sdn ); + if (NULL == sdn) { + LDAPDebug0Args(LDAP_DEBUG_ANY, + "ldbm_back_add: Null target dn\n"); goto error_return; } + dn = slapi_sdn_get_dn(sdn); ldap_result_code = slapi_dn_syntax_check(pb, dn, 1); if (ldap_result_code) { @@ -213,11 +216,10 @@ ldbm_back_add( Slapi_PBlock *pb ) slapi_pblock_get(pb, SLAPI_PB_RESULT_TEXT, &ldap_result_message); goto error_return; } - slapi_sdn_set_dn_byref(&sdn, dn); - slapi_sdn_get_backend_parent(&sdn,&parentsdn,pb->pb_backend); + slapi_sdn_get_backend_parent(sdn, &parentsdn, pb->pb_backend); /* Check if an entry with the intended DN already exists. */ done_with_pblock_entry(pb,SLAPI_ADD_EXISTING_DN_ENTRY); /* Could be through this multiple times */ - addr.dn = dn; + addr.sdn = sdn; addr.udn = NULL; addr.uniqueid = NULL; ldap_result_code= get_copy_of_entry(pb, &addr, &txn, SLAPI_ADD_EXISTING_DN_ENTRY, !is_replicated_operation); @@ -233,7 +235,7 @@ ldbm_back_add( Slapi_PBlock *pb ) slapi_isbitset_int(rc,SLAPI_RTN_BIT_FETCH_PARENT_ENTRY)) { done_with_pblock_entry(pb,SLAPI_ADD_PARENT_ENTRY); /* Could be through this multiple times */ - addr.dn = (char*)slapi_sdn_get_dn (&parentsdn); /* get_copy_of_entry assumes the DN is not normalized */ + addr.sdn = &parentsdn; addr.udn = NULL; addr.uniqueid = operation->o_params.p.p_add.parentuniqueid; ldap_result_code= get_copy_of_entry(pb, &addr, &txn, SLAPI_ADD_PARENT_ENTRY, !is_replicated_operation); @@ -273,7 +275,7 @@ ldbm_back_add( Slapi_PBlock *pb ) */ if(have_parent_address(&parentsdn, operation->o_params.p.p_add.parentuniqueid)) { - addr.dn = (char*)slapi_sdn_get_dn (&parentsdn); + addr.sdn = &parentsdn; addr.udn = NULL; addr.uniqueid = operation->o_params.p.p_add.parentuniqueid; parententry = find_entry2modify_only(pb,be,&addr,&txn); @@ -311,10 +313,11 @@ ldbm_back_add( Slapi_PBlock *pb ) if ( !managedsait && !is_tombstone_operation ) { int err= 0; - Slapi_DN ancestordn= {0}; + Slapi_DN ancestorsdn; struct backentry *ancestorentry; - ancestorentry= dn2ancestor(pb->pb_backend,&sdn,&ancestordn,&txn,&err); - slapi_sdn_done(&ancestordn); + slapi_sdn_init(&ancestorsdn); + ancestorentry= dn2ancestor(pb->pb_backend,sdn,&ancestorsdn,&txn,&err); + slapi_sdn_done(&ancestorsdn); if ( ancestorentry != NULL ) { int sentreferral= check_entry_for_referral(pb, ancestorentry->ep_entry, backentry_get_ndn(ancestorentry), "ldbm_back_add"); @@ -355,7 +358,8 @@ ldbm_back_add( Slapi_PBlock *pb ) * When we resurect a tombstone we must use its UniqueID * to find the tombstone entry and lock it down in the cache. */ - addr.dn = addr.udn = NULL; + addr.udn = NULL; + addr.sdn = NULL; addr.uniqueid = (char *)slapi_entry_get_uniqueid(e); /* jcm - cast away const */ tombstoneentry = find_entry2modify( pb, be, &addr, &txn ); if ( tombstoneentry==NULL ) @@ -368,7 +372,7 @@ ldbm_back_add( Slapi_PBlock *pb ) addingentry = backentry_dup( tombstoneentry ); if ( addingentry==NULL ) { - ldap_result_code= LDAP_OPERATIONS_ERROR; + ldap_result_code= LDAP_OPERATIONS_ERROR; goto error_return; } /* @@ -378,9 +382,12 @@ ldbm_back_add( Slapi_PBlock *pb ) * The entry comes back to life as a Glue entry, so we add the * magic objectclass. */ - slapi_pblock_get( pb, SLAPI_ADD_TARGET, &dn ); - slapi_sdn_set_dn_byref(&sdn, dn); - slapi_entry_set_dn(addingentry->ep_entry, slapi_ch_strdup(dn)); /* The DN is passed into the entry. */ + if (NULL == sdn) { + LDAPDebug0Args(LDAP_DEBUG_ANY, "ldbm_back_add: Null target dn\n"); + goto error_return; + } + dn = slapi_sdn_get_dn(sdn); + slapi_entry_set_sdn(addingentry->ep_entry, sdn); /* The DN is passed into the entry. */ /* LPREPL: the DN is normalized...Somehow who should get a not normalized one */ addingentry->ep_id = slapi_entry_attr_get_ulong(addingentry->ep_entry,"entryid"); slapi_entry_attr_delete(addingentry->ep_entry, SLAPI_ATTR_VALUE_PARENT_UNIQUEID); @@ -541,19 +548,20 @@ ldbm_back_add( Slapi_PBlock *pb ) { /* Here means that we didn't find the parent */ int err = 0; - Slapi_DN ancestordn= {0}; + Slapi_DN ancestorsdn; struct backentry *ancestorentry;
LDAPDebug( LDAP_DEBUG_TRACE, "parent does not exist, pdn = %s\n", slapi_sdn_get_dn(&parentsdn), 0, 0 );
- ancestorentry = dn2ancestor(be, &parentsdn, &ancestordn, &txn, &err ); + slapi_sdn_init(&ancestorsdn); + ancestorentry = dn2ancestor(be, &parentsdn, &ancestorsdn, &txn, &err ); CACHE_RETURN( &inst->inst_cache, &ancestorentry );
ldap_result_code= LDAP_NO_SUCH_OBJECT; - ldap_result_matcheddn= slapi_ch_strdup((char *)slapi_sdn_get_dn(&ancestordn)); /* jcm - cast away const. */ - slapi_sdn_done(&ancestordn); + ldap_result_matcheddn= slapi_ch_strdup((char *)slapi_sdn_get_dn(&ancestorsdn)); /* jcm - cast away const. */ + slapi_sdn_done(&ancestorsdn); goto error_return; } ldap_result_code = plugin_call_acl_plugin (pb, e, NULL, NULL, SLAPI_ACL_ADD, @@ -742,7 +750,11 @@ ldbm_back_add( Slapi_PBlock *pb ) } goto error_return; } - retval = index_addordel_string(be,SLAPI_ATTR_NSCP_ENTRYDN,slapi_sdn_get_ndn(&sdn),addingentry->ep_id,BE_INDEX_DEL,&txn); + retval = index_addordel_string(be, + SLAPI_ATTR_NSCP_ENTRYDN, + slapi_sdn_get_ndn(sdn), + addingentry->ep_id, + BE_INDEX_DEL, &txn); if (DB_LOCK_DEADLOCK == retval) { LDAPDebug( LDAP_DEBUG_ARGS, "add 4 DB_LOCK_DEADLOCK\n", 0, 0, 0 ); /* Retry txn */ @@ -1011,7 +1023,6 @@ common_return: { slapi_send_ldap_result( pb, ldap_result_code, ldap_result_matcheddn, ldap_result_message, 0, NULL ); } - slapi_sdn_done(&sdn); slapi_sdn_done(&parentsdn); slapi_ch_free( (void**)&ldap_result_matcheddn ); slapi_ch_free( (void**)&errbuf ); diff --git a/ldap/servers/slapd/back-ldbm/ldbm_config.c b/ldap/servers/slapd/back-ldbm/ldbm_config.c index 558e1e9..b179591 100644 --- a/ldap/servers/slapd/back-ldbm/ldbm_config.c +++ b/ldap/servers/slapd/back-ldbm/ldbm_config.c @@ -1344,20 +1344,21 @@ void ldbm_config_setup_default(struct ldbminfo *li) } }
-void +int ldbm_config_read_instance_entries(struct ldbminfo *li, const char *backend_type) { Slapi_PBlock *tmp_pb; Slapi_Entry **entries = NULL; char *basedn = NULL; + int rc = 0;
/* Construct the base dn of the subtree that holds the instance entries. */ basedn = slapi_create_dn_string("cn=%s,cn=plugins,cn=config", backend_type); if (NULL == basedn) { LDAPDebug1Arg(LDAP_DEBUG_ANY, "ldbm_config_read_instance_entries: " - "failed create backend dn for %s\n", backend_type); - return; + "failed to create backend dn for %s\n", backend_type); + return 1; }
/* Do a search of the subtree containing the instance entries */ @@ -1368,13 +1369,24 @@ ldbm_config_read_instance_entries(struct ldbminfo *li, const char *backend_type) if (entries!=NULL) { int i; for (i=0; entries[i]!=NULL; i++) { - ldbm_instance_add_instance_entry_callback(NULL, entries[i], NULL, NULL, NULL, li); + rc = ldbm_instance_add_instance_entry_callback(NULL, + entries[i], NULL, NULL, NULL, li); + if (SLAPI_DSE_CALLBACK_ERROR == rc) { + LDAPDebug1Arg(LDAP_DEBUG_ANY, + "ldbm_config_read_instance_entries: " + "failed to add instance entry %s\n", + slapi_entry_get_dn_const(entries[i])); + break; + } + rc = 0; } }
slapi_free_search_results_internal(tmp_pb); slapi_pblock_destroy(tmp_pb); slapi_ch_free_string(&basedn); + + return rc; }
/* Reads in any config information held in the dse for the ldbm plugin. @@ -1453,7 +1465,13 @@ int ldbm_config_load_dse_info(struct ldbminfo *li)
/* Find all the instance entries and create a Slapi_Backend and an * ldbm_instance for each */ - ldbm_config_read_instance_entries(li, li->li_plugin->plg_name); + rval = ldbm_config_read_instance_entries(li, li->li_plugin->plg_name); + if (rval) { + LDAPDebug0Args(LDAP_DEBUG_ANY, + "ldbm_config_load_dse_info: " + "failed to read instance entries\n"); + goto bail; + }
/* setup the dse callback functions for the ldbm backend config entry */ slapi_config_register_callback(SLAPI_OPERATION_SEARCH, DSE_FLAG_PREOP, dn, @@ -1473,7 +1491,7 @@ int ldbm_config_load_dse_info(struct ldbminfo *li) if (NULL == dn) { LDAPDebug1Arg(LDAP_DEBUG_ANY, "ldbm_config_load_dse_info: " - "failed create monitor dn for %s\n", + "failed to create monitor dn for %s\n", li->li_plugin->plg_name); rval = 1; goto bail; diff --git a/ldap/servers/slapd/back-ldbm/ldbm_delete.c b/ldap/servers/slapd/back-ldbm/ldbm_delete.c index 40aed48..c1f1142 100644 --- a/ldap/servers/slapd/back-ldbm/ldbm_delete.c +++ b/ldap/servers/slapd/back-ldbm/ldbm_delete.c @@ -76,6 +76,7 @@ ldbm_back_delete( Slapi_PBlock *pb ) int ldap_result_code= LDAP_SUCCESS; char *ldap_result_message= NULL; Slapi_DN sdn; + Slapi_DN *sdnp = NULL; char *e_uniqueid = NULL; Slapi_DN *nscpEntrySDN = NULL; int dblock_acquired= 0; @@ -97,13 +98,13 @@ ldbm_back_delete( Slapi_PBlock *pb )
slapi_pblock_get( pb, SLAPI_BACKEND, &be); slapi_pblock_get( pb, SLAPI_PLUGIN_PRIVATE, &li ); - slapi_pblock_get( pb, SLAPI_DELETE_TARGET, &dn ); + slapi_pblock_get( pb, SLAPI_DELETE_TARGET_SDN, &sdnp ); slapi_pblock_get( pb, SLAPI_TARGET_ADDRESS, &addr); slapi_pblock_get( pb, SLAPI_TXN, (void**)&parent_txn ); slapi_pblock_get( pb, SLAPI_OPERATION, &operation ); slapi_pblock_get( pb, SLAPI_IS_REPLICATED_OPERATION, &is_replicated_operation ); - /* sdn & parentsdn need to be initialized before "goto *_return */ + /* sdn needs to be initialized before "goto *_return */ slapi_sdn_init(&sdn);
/* dblayer_txn_init needs to be called before "goto error_return" */ @@ -122,7 +123,7 @@ ldbm_back_delete( Slapi_PBlock *pb ) /* retval is -1 */ goto error_return; } - ldap_result_code = slapi_dn_syntax_check(pb, addr->dn, 1); + ldap_result_code = slapi_dn_syntax_check(pb, slapi_sdn_get_dn(sdnp), 1); if (ldap_result_code) { ldap_result_code = LDAP_INVALID_DN_SYNTAX; @@ -137,7 +138,10 @@ ldbm_back_delete( Slapi_PBlock *pb ) inst = (ldbm_instance *) be->be_instance_info;
- slapi_sdn_init_dn_byref(&sdn,dn); + if (NULL == sdnp) { + slapi_sdn_init_normdn_byref(&sdn, dn); + sdnp = &sdn; + }
/* The dblock serializes writes to the database, * which reduces deadlocking in the db code, @@ -318,13 +322,13 @@ ldbm_back_delete( Slapi_PBlock *pb ) Slapi_DN parentsdn;
slapi_sdn_init(&parentsdn); - slapi_sdn_get_backend_parent(&sdn,&parentsdn,pb->pb_backend); + slapi_sdn_get_backend_parent(sdnp, &parentsdn, pb->pb_backend); if ( !slapi_sdn_isempty(&parentsdn) ) { struct backentry *parent = NULL; entry_address parent_addr;
- parent_addr.dn = (char*)slapi_sdn_get_dn (&parentsdn); + parent_addr.sdn = &parentsdn; parent_addr.uniqueid = NULL; parent = find_entry2modify_only(pb,be,&parent_addr,&txn); if (NULL != parent) { diff --git a/ldap/servers/slapd/back-ldbm/ldbm_entryrdn.c b/ldap/servers/slapd/back-ldbm/ldbm_entryrdn.c index 2f1e648..54f22a3 100644 --- a/ldap/servers/slapd/back-ldbm/ldbm_entryrdn.c +++ b/ldap/servers/slapd/back-ldbm/ldbm_entryrdn.c @@ -445,7 +445,7 @@ entryrdn_rename_subtree(backend *be, slapi_log_error(SLAPI_LOG_FATAL, ENTRYRDN_TAG, "entryrdn_rename_subtree: Param error: Empty %s\n", NULL==be?"backend":NULL==oldsdn?"old dn": - (NULL==mynewsrdn&&NULL==mynewsupsdn)?"new dn and new superior": + (NULL==newsrdn&&NULL==newsupsdn)?"new dn and new superior": 0==id?"id":"unknown"); goto bail; } @@ -1015,7 +1015,6 @@ entryrdn_lookup_dn(backend *be, char *nrdn = NULL; size_t nrdn_len = 0; ID workid = id; /* starting from the given id */ - ID previd = id; rdn_elem *elem = NULL; int maybesuffix = 0;
@@ -1111,7 +1110,6 @@ retry_get1: }
/* Iterate over the duplicates to get the direct child's ID */ - previd = workid; workid = 0; if (maybesuffix) { /* it is a suffix, indeed. done. */ diff --git a/ldap/servers/slapd/back-ldbm/ldbm_instance_config.c b/ldap/servers/slapd/back-ldbm/ldbm_instance_config.c index 7709cfb..88b20d0 100644 --- a/ldap/servers/slapd/back-ldbm/ldbm_instance_config.c +++ b/ldap/servers/slapd/back-ldbm/ldbm_instance_config.c @@ -773,8 +773,8 @@ ldbm_instance_modify_config_entry_callback(Slapi_PBlock *pb, Slapi_Entry* entryB if (strcasecmp(attr_name, CONFIG_INSTANCE_SUFFIX) == 0) { /* naughty naughty, we don't allow this */ rc = LDAP_UNWILLING_TO_PERFORM; - PR_snprintf(returntext, SLAPI_DSE_RETURNTEXT_SIZE, - "Can't change the root suffix of a backend"); + PR_snprintf(returntext, SLAPI_DSE_RETURNTEXT_SIZE, + "Can't change the root suffix of a backend"); LDAPDebug(LDAP_DEBUG_ANY, "ldbm: modify attempted to change the root suffix " "of a backend (which is not allowed)\n", @@ -841,10 +841,13 @@ static int ldbm_instance_generate(struct ldbminfo *li, char *instance_name, new_be = slapi_be_new(LDBM_DATABASE_TYPE_NAME /* type */, instance_name, 0 /* public */, 1 /* do log changes */); new_be->be_database = li->li_plugin; - ldbm_instance_create(new_be, instance_name); + rc = ldbm_instance_create(new_be, instance_name); + if (rc) { + goto bail; + }
ldbm_instance_config_load_dse_info(new_be->be_instance_info); - rc = ldbm_instance_create_default_indexes(new_be); + ldbm_instance_create_default_indexes(new_be);
/* if USN plugin is enabled, set slapi_counter */ if (plugin_enabled("USN", li->li_identity) && ldbm_back_isinitialized()) { @@ -867,7 +870,7 @@ static int ldbm_instance_generate(struct ldbminfo *li, char *instance_name, if (ret_be != NULL) { *ret_be = new_be; } - +bail: return rc; }
@@ -881,7 +884,13 @@ ldbm_instance_postadd_instance_entry_callback(Slapi_PBlock *pb, Slapi_Entry* ent int rval = 0;
parse_ldbm_instance_entry(entryBefore, &instance_name); - ldbm_instance_generate(li, instance_name, &be); + rval = ldbm_instance_generate(li, instance_name, &be); + if (rval) { + LDAPDebug(LDAP_DEBUG_ANY, + "ldbm_instance_postadd_instance_entry_callback: " + "ldbm_instance_generate (%s) failed (%d)\n", + instance_name, rval, 0); + }
inst = ldbm_instance_find_by_name(li, instance_name);
diff --git a/ldap/servers/slapd/back-ldbm/ldbm_modify.c b/ldap/servers/slapd/back-ldbm/ldbm_modify.c index ff2fc97..1a85e14 100644 --- a/ldap/servers/slapd/back-ldbm/ldbm_modify.c +++ b/ldap/servers/slapd/back-ldbm/ldbm_modify.c @@ -244,7 +244,7 @@ ldbm_back_modify( Slapi_PBlock *pb ) { goto error_return; } - ldap_result_code = slapi_dn_syntax_check(pb, addr->dn, 1); + ldap_result_code = slapi_dn_syntax_check(pb, slapi_sdn_get_dn(addr->sdn), 1); if (ldap_result_code) { ldap_result_code = LDAP_INVALID_DN_SYNTAX; diff --git a/ldap/servers/slapd/back-ldbm/ldbm_modrdn.c b/ldap/servers/slapd/back-ldbm/ldbm_modrdn.c index bcbe9c7..493e476 100644 --- a/ldap/servers/slapd/back-ldbm/ldbm_modrdn.c +++ b/ldap/servers/slapd/back-ldbm/ldbm_modrdn.c @@ -90,10 +90,10 @@ ldbm_back_modrdn( Slapi_PBlock *pb ) IDList *children= NULL; struct backentry **child_entries = NULL; struct backdn **child_dns = NULL; - Slapi_DN dn_olddn = {0}; - Slapi_DN dn_newdn = {0}; - Slapi_DN dn_newrdn = {0}; - Slapi_DN dn_newsuperiordn = {0}; + Slapi_DN *sdn = NULL; + Slapi_DN dn_newdn; + Slapi_DN dn_newrdn; + Slapi_DN *dn_newsuperiordn = NULL; Slapi_DN dn_parentdn; int rc; int isroot; @@ -109,15 +109,15 @@ ldbm_back_modrdn( Slapi_PBlock *pb ) entry_address *old_addr; entry_address oldparent_addr; entry_address *newsuperior_addr; - char *dn; char ebuf[BUFSIZ]; CSN *opcsn = NULL;
/* sdn & parentsdn need to be initialized before "goto *_return" */ slapi_sdn_init(&dn_newdn); + slapi_sdn_init(&dn_newrdn); slapi_sdn_init(&dn_parentdn);
- slapi_pblock_get( pb, SLAPI_MODRDN_TARGET, &dn ); + slapi_pblock_get( pb, SLAPI_MODRDN_TARGET_SDN, &sdn ); slapi_pblock_get( pb, SLAPI_BACKEND, &be); slapi_pblock_get( pb, SLAPI_PLUGIN_PRIVATE, &li ); slapi_pblock_get( pb, SLAPI_TXN, (void**)&parent_txn ); @@ -127,6 +127,12 @@ ldbm_back_modrdn( Slapi_PBlock *pb ) is_ruv = operation_is_flag_set(operation, OP_FLAG_REPL_RUV); is_fixup_operation = operation_is_flag_set(operation, OP_FLAG_REPL_FIXUP);
+ if (NULL == sdn) { + slapi_send_ldap_result( pb, LDAP_INVALID_DN_SYNTAX, NULL, + "Null target DN", 0, NULL ); + return( -1 ); + } + /* dblayer_txn_init needs to be called before "goto error_return" */ dblayer_txn_init(li,&txn); /* the calls to search for entries require the parent txn if any @@ -140,23 +146,21 @@ ldbm_back_modrdn( Slapi_PBlock *pb )
inst = (ldbm_instance *) be->be_instance_info; { - char *newrdn, *newsuperiordn; + char *newrdn/* , *newsuperiordn */; slapi_pblock_get( pb, SLAPI_MODRDN_NEWRDN, &newrdn ); - slapi_pblock_get( pb, SLAPI_MODRDN_NEWSUPERIOR, &newsuperiordn ); - slapi_sdn_init_dn_byref(&dn_olddn,dn); - slapi_sdn_init_dn_byref(&dn_newrdn,newrdn); - slapi_sdn_init_dn_byref(&dn_newsuperiordn,newsuperiordn); - slapi_sdn_get_parent(&dn_olddn,&dn_parentdn); + slapi_pblock_get( pb, SLAPI_MODRDN_NEWSUPERIOR_SDN, &dn_newsuperiordn ); + slapi_sdn_init_normdn_byref(&dn_newrdn, newrdn); + /* slapi_sdn_init_normdn_byref(&dn_newsuperiordn, newsuperiordn); */ + slapi_sdn_get_parent(sdn, &dn_parentdn); }
/* if old and new superior are equals, newsuperior should not be set * Here we have to reset newsuperiordn in order to save processing and * avoid later deadlock when trying to fetch twice the same entry */ - if (slapi_sdn_compare(&dn_newsuperiordn, &dn_parentdn) == 0) + if (slapi_sdn_compare(dn_newsuperiordn, &dn_parentdn) == 0) { - slapi_sdn_done(&dn_newsuperiordn); - slapi_sdn_init_dn_byref(&dn_newsuperiordn,NULL); + slapi_sdn_done(dn_newsuperiordn); }
/* @@ -164,7 +168,7 @@ ldbm_back_modrdn( Slapi_PBlock *pb ) * Replicated Operations are allowed to change the superior */ if ( !entryrdn_get_switch() && - (!is_replicated_operation && !slapi_sdn_isempty(&dn_newsuperiordn))) + (!is_replicated_operation && !slapi_sdn_isempty(dn_newsuperiordn))) { slapi_send_ldap_result( pb, LDAP_UNWILLING_TO_PERFORM, NULL, "server does not support moving of entries", 0, NULL ); @@ -213,14 +217,15 @@ ldbm_back_modrdn( Slapi_PBlock *pb )
/* see if an entry with the new name already exists */ done_with_pblock_entry(pb,SLAPI_MODRDN_EXISTING_ENTRY); /* Could be through this multiple times */ - slapi_sdn_done(&dn_newrdn); slapi_pblock_get(pb, SLAPI_MODRDN_NEWRDN, &newrdn); - slapi_sdn_init_dn_byref(&dn_newrdn,newrdn); - newdn= moddn_get_newdn(pb,&dn_olddn,&dn_newrdn,&dn_newsuperiordn); + slapi_sdn_init_normdn_byref(&dn_newrdn, newrdn); + newdn= moddn_get_newdn(pb,sdn, &dn_newrdn, dn_newsuperiordn); slapi_sdn_set_dn_passin(&dn_newdn,newdn); - new_addr.dn = (char*)slapi_sdn_get_ndn (&dn_newdn); + new_addr.sdn = &dn_newdn; + new_addr.udn = NULL; /* check dn syntax on newdn */ - ldap_result_code = slapi_dn_syntax_check(pb, new_addr.dn, 1); + ldap_result_code = slapi_dn_syntax_check(pb, + (char *)slapi_sdn_get_ndn(&dn_newdn), 1); if (ldap_result_code) { ldap_result_code = LDAP_INVALID_DN_SYNTAX; @@ -241,23 +246,22 @@ ldbm_back_modrdn( Slapi_PBlock *pb ) { /* find and lock the old parent entry */ done_with_pblock_entry(pb,SLAPI_MODRDN_PARENT_ENTRY); /* Could be through this multiple times */ - oldparent_addr.dn = (char*)slapi_sdn_get_ndn (&dn_parentdn); + oldparent_addr.sdn = &dn_parentdn; oldparent_addr.uniqueid = NULL; ldap_result_code= get_copy_of_entry(pb, &oldparent_addr, &txn, SLAPI_MODRDN_PARENT_ENTRY, !is_replicated_operation); }
/* <new superior> */ - if(slapi_sdn_get_ndn(&dn_newsuperiordn)!=NULL && + if(slapi_sdn_get_ndn(dn_newsuperiordn)!=NULL && slapi_isbitset_int(rc,SLAPI_RTN_BIT_FETCH_NEWPARENT_ENTRY)) { /* find and lock the new parent entry */ done_with_pblock_entry(pb,SLAPI_MODRDN_NEWPARENT_ENTRY); /* Could be through this multiple times */ /* Check that this really is a new superior, * and not the same old one. Compare parentdn & newsuperior */ - if (slapi_sdn_compare(&dn_newsuperiordn, &dn_parentdn) == 0) + if (slapi_sdn_compare(dn_newsuperiordn, &dn_parentdn) == 0) { - slapi_sdn_done(&dn_newsuperiordn); - slapi_sdn_init_dn_byref(&dn_newsuperiordn,NULL); + slapi_sdn_done(dn_newsuperiordn); } else { @@ -271,7 +275,7 @@ ldbm_back_modrdn( Slapi_PBlock *pb ) } else { - my_addr.dn = (char *)slapi_sdn_get_ndn (&dn_newsuperiordn); + my_addr.sdn = dn_newsuperiordn; my_addr.uniqueid = NULL; newsuperior_addr = &my_addr; } @@ -329,7 +333,7 @@ ldbm_back_modrdn( Slapi_PBlock *pb ) if((entry != NULL) && /* allow modrdn even if the src dn and dest dn are identical */ (0 != slapi_sdn_compare((const Slapi_DN *)&dn_newdn, - (const Slapi_DN *)&dn_olddn))) + (const Slapi_DN *)sdn))) { ldap_result_code= LDAP_ALREADY_EXISTS; goto error_return; @@ -337,13 +341,13 @@ ldbm_back_modrdn( Slapi_PBlock *pb ) }
/* Fetch and lock the parent of the entry that is moving */ - oldparent_addr.dn = (char*)slapi_sdn_get_dn (&dn_parentdn); + oldparent_addr.sdn = &dn_parentdn; oldparent_addr.uniqueid = NULL; parententry = find_entry2modify_only( pb, be, &oldparent_addr, &txn ); modify_init(&parent_modify_context,parententry);
/* Fetch and lock the new parent of the entry that is moving */ - if(slapi_sdn_get_ndn(&dn_newsuperiordn)!=NULL) + if(slapi_sdn_get_ndn(dn_newsuperiordn) != NULL) { slapi_pblock_get (pb, SLAPI_MODRDN_NEWSUPERIOR_ADDRESS, &newsuperior_addr); newparententry = find_entry2modify_only( pb, be, newsuperior_addr, &txn ); @@ -376,37 +380,46 @@ ldbm_back_modrdn( Slapi_PBlock *pb ) * instead. Otherwise, a ModRDN operation will potentially change an * entry's entire DN (at least with respect to case and spacing). */ - slapi_sdn_copy( slapi_entry_get_sdn_const( e->ep_entry ), &dn_olddn ); + slapi_sdn_copy( slapi_entry_get_sdn_const( e->ep_entry ), sdn ); + slapi_pblock_set( pb, SLAPI_MODRDN_TARGET_SDN, sdn ); if (newparententry != NULL) { /* don't forget we also want to preserve case of new superior */ - slapi_sdn_copy(slapi_entry_get_sdn_const(newparententry->ep_entry), &dn_newsuperiordn); + if (NULL == dn_newsuperiordn) { + dn_newsuperiordn = slapi_sdn_dup( + slapi_entry_get_sdn_const(newparententry->ep_entry)); + } else { + slapi_sdn_copy(slapi_entry_get_sdn_const(newparententry->ep_entry), + dn_newsuperiordn); + } + slapi_pblock_set( pb, SLAPI_MODRDN_NEWSUPERIOR_SDN, dn_newsuperiordn ); } slapi_sdn_set_dn_passin(&dn_newdn, - moddn_get_newdn(pb, &dn_olddn, &dn_newrdn, &dn_newsuperiordn)); + moddn_get_newdn(pb, sdn, &dn_newrdn, dn_newsuperiordn));
/* Check that we're allowed to add an entry below the new superior */ if ( newparententry == NULL ) { /* There may not be a new parent because we don't intend there to be one. */ - if(slapi_sdn_get_ndn(&dn_newsuperiordn)!=NULL) + if(slapi_sdn_get_ndn(dn_newsuperiordn)!=NULL) { /* If the new entry is to be a suffix, and we're root, then it's OK that the new parent doesn't exist */ - if(!(slapi_dn_isbesuffix(pb,slapi_sdn_get_ndn(&dn_newdn)) && isroot)) + if (!(slapi_be_issuffix(pb->pb_backend, &dn_newdn)) && isroot) { /* Here means that we didn't find the parent */ int err = 0; - Slapi_DN ancestordn = {0}; + Slapi_DN ancestorsdn; struct backentry *ancestorentry; - ancestorentry= dn2ancestor(be,&dn_newdn,&ancestordn,&txn,&err); + slapi_sdn_init(&ancestorsdn); + ancestorentry= dn2ancestor(be,&dn_newdn,&ancestorsdn,&txn,&err); CACHE_RETURN( &inst->inst_cache, &ancestorentry ); - ldap_result_matcheddn= slapi_ch_strdup((char *) slapi_sdn_get_dn(&ancestordn)); + ldap_result_matcheddn= slapi_ch_strdup((char *) slapi_sdn_get_dn(&ancestorsdn)); ldap_result_code= LDAP_NO_SUCH_OBJECT; LDAPDebug( LDAP_DEBUG_TRACE, "ldbm_back_modrdn: New superior " "does not exist matched %s, newsuperior = %s\n", ldap_result_matcheddn == NULL ? "NULL" : ldap_result_matcheddn, - slapi_sdn_get_ndn(&dn_newsuperiordn), 0 ); - slapi_sdn_done(&ancestordn); + slapi_sdn_get_ndn(dn_newsuperiordn), 0 ); + slapi_sdn_done(&ancestorsdn); goto error_return; } } @@ -426,7 +439,7 @@ ldbm_back_modrdn( Slapi_PBlock *pb ) if ( parententry == NULL ) { /* If the entry a suffix, and we're root, then it's OK that the parent doesn't exist */ - if(!(slapi_dn_isbesuffix(pb,slapi_sdn_get_ndn(&dn_olddn)) && isroot)) + if (!(slapi_be_issuffix(pb->pb_backend, sdn)) && isroot) { /* Here means that we didn't find the parent */ ldap_result_matcheddn = "NULL"; @@ -485,7 +498,7 @@ ldbm_back_modrdn( Slapi_PBlock *pb ) if (( cache_add_tentative( &inst->inst_cache, ec, NULL ) != 0 ) && /* allow modrdn even if the src dn and dest dn are identical */ ( 0 != slapi_sdn_compare((const Slapi_DN *)&dn_newdn, - (const Slapi_DN *)&dn_olddn)) ) + (const Slapi_DN *)sdn)) ) { /* somebody must've created it between dn2entry() and here */ /* JCMREPL - Hmm... we can't permit this to happen...? */ @@ -498,7 +511,7 @@ ldbm_back_modrdn( Slapi_PBlock *pb ) { slapi_mods_init(&smods_generated,4); slapi_mods_init(&smods_generated_wsi,4); - ldap_result_code = moddn_newrdn_mods(pb, slapi_sdn_get_ndn(&dn_olddn), + ldap_result_code = moddn_newrdn_mods(pb, slapi_sdn_get_ndn(sdn), ec, &smods_generated_wsi, is_replicated_operation); if (ldap_result_code != LDAP_SUCCESS) { if (ldap_result_code == LDAP_UNWILLING_TO_PERFORM) @@ -519,7 +532,7 @@ ldbm_back_modrdn( Slapi_PBlock *pb ) /* * Update parentid if we have a new superior. */ - if(slapi_sdn_get_dn(&dn_newsuperiordn)!=NULL) { + if(slapi_sdn_get_dn(dn_newsuperiordn)!=NULL) { char buf[40]; /* Enough for an ID */
if (parententry != NULL) { @@ -619,7 +632,7 @@ ldbm_back_modrdn( Slapi_PBlock *pb ) * If the entry has a new superior then the subordinate count * of the parents must be updated. */ - if(slapi_sdn_get_dn(&dn_newsuperiordn)!=NULL) + if(slapi_sdn_get_dn(dn_newsuperiordn)!=NULL) { /* * Update the subordinate count of the parents to reflect the moved child. @@ -652,12 +665,12 @@ ldbm_back_modrdn( Slapi_PBlock *pb ) /* JCM - This is where the subtree lock will appear */ if (entryrdn_get_switch()) /* subtree-rename: on */ { - children = moddn_get_children(&txn, pb, be, e, &dn_olddn, + children = moddn_get_children(&txn, pb, be, e, sdn, &child_entries, &child_dns); } else { - children = moddn_get_children(&txn, pb, be, e, &dn_olddn, + children = moddn_get_children(&txn, pb, be, e, sdn, &child_entries, NULL); }
@@ -781,7 +794,7 @@ ldbm_back_modrdn( Slapi_PBlock *pb ) } } } - if (slapi_sdn_get_dn(&dn_newsuperiordn)!=NULL) + if (slapi_sdn_get_dn(dn_newsuperiordn)!=NULL) { /* Push out the db modifications from the parent entry */ retval = modify_update_all(be, pb, &parent_modify_context, &txn); @@ -826,8 +839,8 @@ ldbm_back_modrdn( Slapi_PBlock *pb ) /* * Update ancestorid index. */ - if (slapi_sdn_get_dn(&dn_newsuperiordn)!=NULL) { - retval = ldbm_ancestorid_move_subtree(be, &dn_olddn, &dn_newdn, e->ep_id, children, &txn); + if (slapi_sdn_get_dn(dn_newsuperiordn)!=NULL) { + retval = ldbm_ancestorid_move_subtree(be, sdn, &dn_newdn, e->ep_id, children, &txn); if (retval != 0) { if (retval == DB_LOCK_DEADLOCK) continue; if (retval == DB_RUNRECOVERY || LDBM_OS_ERR_IS_DISKFULL(retval)) @@ -844,9 +857,8 @@ ldbm_back_modrdn( Slapi_PBlock *pb ) { Slapi_RDN newsrdn; slapi_rdn_init_sdn(&newsrdn, (const Slapi_DN *)&dn_newdn); - rc = entryrdn_rename_subtree(be, - (const Slapi_DN *)&dn_olddn, &newsrdn, - (const Slapi_DN *)&dn_newsuperiordn, + rc = entryrdn_rename_subtree(be, (const Slapi_DN *)sdn, &newsrdn, + (const Slapi_DN *)dn_newsuperiordn, e->ep_id, &txn); slapi_rdn_done(&newsrdn); if (rc) { @@ -861,7 +873,7 @@ ldbm_back_modrdn( Slapi_PBlock *pb ) */ if (!entryrdn_get_switch() && children) /* subtree-rename: off */ { - retval= moddn_rename_children(&txn, pb, be, children, &dn_olddn, + retval= moddn_rename_children(&txn, pb, be, children, sdn, &dn_newdn, child_entries); } if (DB_LOCK_DEADLOCK == retval) @@ -1100,10 +1112,8 @@ common_return: if (ldap_result_matcheddn && 0 != strcmp(ldap_result_matcheddn, "NULL")) slapi_ch_free((void**)&ldap_result_matcheddn); idl_free(children); - slapi_sdn_done(&dn_olddn); slapi_sdn_done(&dn_newdn); slapi_sdn_done(&dn_newrdn); - slapi_sdn_done(&dn_newsuperiordn); slapi_sdn_done(&dn_parentdn); modify_term(&parent_modify_context,be); modify_term(&newparent_modify_context,be); @@ -1118,7 +1128,8 @@ common_return: slapi_ch_free((void**)&errbuf); if (retval == 0 && opcsn != NULL && !is_fixup_operation) { - slapi_pblock_set(pb, SLAPI_URP_NAMING_COLLISION_DN, slapi_ch_strdup (dn)); + slapi_pblock_set(pb, SLAPI_URP_NAMING_COLLISION_DN, + slapi_ch_strdup(slapi_sdn_get_dn(sdn))); } if (pb->pb_conn) { diff --git a/ldap/servers/slapd/back-ldbm/ldbm_search.c b/ldap/servers/slapd/back-ldbm/ldbm_search.c index 66ec886..91b0280 100644 --- a/ldap/servers/slapd/back-ldbm/ldbm_search.c +++ b/ldap/servers/slapd/back-ldbm/ldbm_search.c @@ -159,7 +159,6 @@ ldbm_back_search_cleanup(Slapi_PBlock *pb, int ldap_result, char* ldap_result_description, int function_result, - Slapi_DN *sdn, struct vlv_request *vlv_request_control, struct backentry *e) { @@ -192,7 +191,6 @@ ldbm_back_search_cleanup(Slapi_PBlock *pb, delete_search_result_set(&sr); } } - slapi_sdn_done(sdn); if (vlv_request_control) { berval_done(&vlv_request_control->value); @@ -218,8 +216,8 @@ ldbm_back_search( Slapi_PBlock *pb ) struct ldbminfo *li; struct backentry *e; IDList *candidates= NULL; - char *base; - Slapi_DN basesdn; + const char *base; + Slapi_DN *basesdn = NULL; int scope; LDAPControl **controls = NULL; Slapi_Operation *operation; @@ -254,7 +252,7 @@ ldbm_back_search( Slapi_PBlock *pb ) slapi_pblock_get( pb, SLAPI_BACKEND, &be ); slapi_pblock_get( pb, SLAPI_OPERATION, &operation); slapi_pblock_get( pb, SLAPI_PLUGIN_PRIVATE, &li ); - slapi_pblock_get( pb, SLAPI_SEARCH_TARGET, &base ); + slapi_pblock_get( pb, SLAPI_SEARCH_TARGET_SDN, &basesdn ); slapi_pblock_get( pb, SLAPI_TARGET_ADDRESS, &addr); slapi_pblock_get( pb, SLAPI_SEARCH_SCOPE, &scope ); slapi_pblock_get( pb, SLAPI_REQCONTROLS, &controls ); @@ -263,7 +261,13 @@ ldbm_back_search( Slapi_PBlock *pb )
inst = (ldbm_instance *) be->be_instance_info;
- slapi_sdn_init_dn_ndn_byref(&basesdn,base); /* normalized by front end*/ + if (NULL == basesdn) { + slapi_send_ldap_result( pb, LDAP_INVALID_DN_SYNTAX, NULL, + "Null target DN", 0, NULL ); + return( -1 ); + } + base = slapi_sdn_get_dn(basesdn); + /* Initialize the result set structure here because we need to use it during search processing */ /* Beware that if we exit this routine sideways, we might leak this structure */ sr = new_search_result_set( NULL, 0, @@ -285,8 +289,7 @@ ldbm_back_search( Slapi_PBlock *pb ) /* Badly formed SORT control */ return ldbm_back_search_cleanup(pb, li, sort_control, LDAP_PROTOCOL_ERROR, "Sort Control", - SLAPI_FAIL_GENERAL, &basesdn, - NULL, NULL); + SLAPI_FAIL_GENERAL, NULL, NULL); } /* set this operation includes the server side sorting */ operation->o_flags |= OP_FLAG_SERVER_SIDE_SORTING; @@ -303,8 +306,7 @@ ldbm_back_search( Slapi_PBlock *pb ) { /* Badly formed VLV control */ return ldbm_back_search_cleanup(pb, li, sort_control, - r, "VLV Control", - SLAPI_FAIL_GENERAL, &basesdn, + r, "VLV Control", SLAPI_FAIL_GENERAL, &vlv_request_control, NULL); } { @@ -325,8 +327,7 @@ ldbm_back_search( Slapi_PBlock *pb ) { /* Client isn't allowed to do this. */ return ldbm_back_search_cleanup(pb, li, sort_control, - r, "VLV Control", - SLAPI_FAIL_GENERAL, &basesdn, + r, "VLV Control", SLAPI_FAIL_GENERAL, &vlv_request_control, NULL); } } @@ -341,8 +342,7 @@ ldbm_back_search( Slapi_PBlock *pb ) /* Can't have a VLV control without a SORT control */ return ldbm_back_search_cleanup(pb, li, sort_control, LDAP_SORT_CONTROL_MISSING, "VLV Control", - SLAPI_FAIL_GENERAL, &basesdn, - &vlv_request_control, NULL); + SLAPI_FAIL_GENERAL, &vlv_request_control, NULL); } } } @@ -395,15 +395,13 @@ ldbm_back_search( Slapi_PBlock *pb ) { return ldbm_back_search_cleanup(pb, li, sort_control, LDAP_UNWILLING_TO_PERFORM, ctrlstr, - SLAPI_FAIL_GENERAL, &basesdn, - &vlv_request_control, NULL); + SLAPI_FAIL_GENERAL, &vlv_request_control, NULL); } else { return ldbm_back_search_cleanup(pb, li, sort_control, LDAP_VIRTUAL_LIST_VIEW_ERROR, ctrlstr, - SLAPI_FAIL_GENERAL, &basesdn, - &vlv_request_control, NULL); + SLAPI_FAIL_GENERAL, &vlv_request_control, NULL); } } else @@ -418,8 +416,7 @@ ldbm_back_search( Slapi_PBlock *pb ) sort_make_sort_response_control(pb, LDAP_UNWILLING_TO_PERFORM, NULL); return ldbm_back_search_cleanup(pb, li, sort_control, LDAP_UNAVAILABLE_CRITICAL_EXTENSION, ctrlstr, - SLAPI_FAIL_GENERAL, &basesdn, - &vlv_request_control, NULL); + SLAPI_FAIL_GENERAL, &vlv_request_control, NULL); } else /* vlv and sorting are not critical, so ignore the control */ { @@ -453,7 +450,7 @@ ldbm_back_search( Slapi_PBlock *pb ) { /* error or referral sent by find_entry */ return ldbm_back_search_cleanup(pb, li, sort_control, - -1, NULL, 1, &basesdn, &vlv_request_control, NULL); + -1, NULL, 1, &vlv_request_control, NULL); } }
@@ -478,21 +475,20 @@ ldbm_back_search( Slapi_PBlock *pb ) */ if ((NULL != controls) && (sort) && (vlv)) { /* This candidate list is for vlv, no need for sort only. */ - switch (vlv_search_build_candidate_list(pb, &basesdn, &vlv_rc, + switch (vlv_search_build_candidate_list(pb, basesdn, &vlv_rc, sort_control, (vlv ? &vlv_request_control : NULL), &candidates, &vlv_response_control)) { case VLV_ACCESS_DENIED: return ldbm_back_search_cleanup(pb, li, sort_control, vlv_rc, "VLV Control", - SLAPI_FAIL_GENERAL, &basesdn, + SLAPI_FAIL_GENERAL, &vlv_request_control, e); case VLV_BLD_LIST_FAILED: return ldbm_back_search_cleanup(pb, li, sort_control, vlv_response_control.result, NULL, SLAPI_FAIL_GENERAL, - &basesdn, &vlv_request_control, - e); + &vlv_request_control, e);
case LDAP_SUCCESS: /* Log to the access log the particulars of this sort request */ @@ -513,7 +509,6 @@ ldbm_back_search( Slapi_PBlock *pb ) LDAP_OPERATIONS_ERROR, "Sort Response Control", SLAPI_FAIL_GENERAL, - &basesdn, &vlv_request_control, e); } } @@ -526,7 +521,7 @@ ldbm_back_search( Slapi_PBlock *pb ) { /* Error result sent by build_candidate_list */ return ldbm_back_search_cleanup(pb, li, sort_control, -1, - NULL, rc, &basesdn, + NULL, rc, &vlv_request_control, e); } /* @@ -559,7 +554,7 @@ ldbm_back_search( Slapi_PBlock *pb ) IDList *idl = NULL; Slapi_Filter *filter = NULL; slapi_pblock_get( pb, SLAPI_SEARCH_FILTER, &filter ); - r = vlv_filter_candidates(be, pb, candidates, &basesdn, + r = vlv_filter_candidates(be, pb, candidates, basesdn, scope, filter, &idl, lookthrough_limit, time_up); if(r == 0) @@ -570,7 +565,7 @@ ldbm_back_search( Slapi_PBlock *pb ) else { return ldbm_back_search_cleanup(pb, li, sort_control, - r, NULL, -1, &basesdn, + r, NULL, -1, &vlv_request_control, e); } } @@ -589,7 +584,7 @@ ldbm_back_search( Slapi_PBlock *pb ) return ldbm_back_search_cleanup(pb, li, sort_control, LDAP_PROTOCOL_ERROR, "Sort Response Control", -1, - &basesdn, &vlv_request_control, e); + &vlv_request_control, e); } } else @@ -630,7 +625,6 @@ ldbm_back_search( Slapi_PBlock *pb ) return ldbm_back_search_cleanup(pb, li, sort_control, LDAP_PROTOCOL_ERROR, "Sort Control", -1, - &basesdn, &vlv_request_control, e); case LDAP_UNWILLING_TO_PERFORM: /* Too hard */ case LDAP_OPERATIONS_ERROR: /* Operation error */ @@ -673,7 +667,7 @@ ldbm_back_search( Slapi_PBlock *pb ) return ldbm_back_search_cleanup(pb, li, sort_control, (abandoned?-1:LDAP_PROTOCOL_ERROR), "Sort Response Control", -1, - &basesdn, &vlv_request_control, e); + &vlv_request_control, e); } } } @@ -700,7 +694,7 @@ ldbm_back_search( Slapi_PBlock *pb ) { return ldbm_back_search_cleanup(pb, li, sort_control, vlv_response_control.result, - NULL, -1, &basesdn, + NULL, -1, &vlv_request_control, e); } } @@ -720,7 +714,7 @@ ldbm_back_search( Slapi_PBlock *pb ) return ldbm_back_search_cleanup(pb, li, sort_control, (abandoned?-1:LDAP_PROTOCOL_ERROR), "VLV Response Control", -1, - &basesdn, &vlv_request_control, e); + &vlv_request_control, e); } /* Log the VLV operation */ vlv_print_access_log(pb,&vlv_request_control,&vlv_response_control); @@ -783,7 +777,7 @@ ldbm_back_search( Slapi_PBlock *pb ) /* Fix for bugid #394184, SD, 05 Jul 00 */ /* tmp_err == -1: no error */ return ldbm_back_search_cleanup(pb, li, sort_control, tmp_err, tmp_desc, - (tmp_err == -1 ? 0 : -1), &basesdn, + (tmp_err == -1 ? 0 : -1), &vlv_request_control, NULL); /* end Fix for bugid #394184 */ } @@ -1205,7 +1199,7 @@ ldbm_back_next_search_entry_ext( Slapi_PBlock *pb, int use_extension ) int managedsait; Slapi_Attr *attr; Slapi_Filter *filter; - char *base; + const char *base; back_search_result_set *sr; ID id; struct backentry *e; @@ -1214,7 +1208,7 @@ ldbm_back_next_search_entry_ext( Slapi_PBlock *pb, int use_extension ) int tlimit, llimit, slimit, isroot; struct berval **urls = NULL; int err; - Slapi_DN basesdn = {0}; + Slapi_DN *basesdn = NULL; char *target_uniqueid; int rc = 0; int estimate = 0; /* estimated search result count */ @@ -1225,7 +1219,7 @@ ldbm_back_next_search_entry_ext( Slapi_PBlock *pb, int use_extension ) slapi_pblock_get( pb, SLAPI_SEARCH_SCOPE, &scope ); slapi_pblock_get( pb, SLAPI_MANAGEDSAIT, &managedsait ); slapi_pblock_get( pb, SLAPI_SEARCH_FILTER, &filter ); - slapi_pblock_get( pb, SLAPI_SEARCH_TARGET, &base ); + slapi_pblock_get( pb, SLAPI_SEARCH_TARGET_SDN, &basesdn ); slapi_pblock_get( pb, SLAPI_NENTRIES, &nentries ); slapi_pblock_get( pb, SLAPI_SEARCH_SIZELIMIT, &slimit ); slapi_pblock_get( pb, SLAPI_SEARCH_TIMELIMIT, &tlimit ); @@ -1240,6 +1234,13 @@ ldbm_back_next_search_entry_ext( Slapi_PBlock *pb, int use_extension ) goto bail; }
+ if (NULL == basesdn) { + slapi_send_ldap_result( pb, LDAP_INVALID_DN_SYNTAX, NULL, + "Null target DN", 0, NULL ); + return( -1 ); + } + base = slapi_sdn_get_dn(basesdn); + if (sr->sr_current_sizelimit >= 0) { /* * sr_current_sizelimit contains the current sizelimit. @@ -1254,7 +1255,10 @@ ldbm_back_next_search_entry_ext( Slapi_PBlock *pb, int use_extension )
inst = (ldbm_instance *) be->be_instance_info;
- slapi_sdn_init_dn_ndn_byref(&basesdn,base); /* normalized by front end */ + if (NULL == basesdn) { + basesdn = slapi_sdn_new_normdn_byref(base); + slapi_pblock_set(pb, SLAPI_SEARCH_TARGET_SDN, basesdn); + } /* Return to the cache the entry we handed out last time */ /* If we are using the extension, the front end will tell * us when to do this so we don't do it now */ @@ -1399,7 +1403,7 @@ ldbm_back_next_search_entry_ext( Slapi_PBlock *pb, int use_extension ) char ebuf[ BUFSIZ ]; LDAPDebug( LDAP_DEBUG_ANY, "null ref in (%s)\n", escape_string( backentry_get_ndn(e), ebuf ), 0, 0 ); } - else if ( slapi_sdn_scope_test( backentry_get_sdn(e), &basesdn, scope )) + else if ( slapi_sdn_scope_test( backentry_get_sdn(e), basesdn, scope )) { if ( use_extension ) { slapi_pblock_set( pb, SLAPI_SEARCH_RESULT_ENTRY_EXT, e ); @@ -1473,7 +1477,7 @@ ldbm_back_next_search_entry_ext( Slapi_PBlock *pb, int use_extension ) * just forget about it, since we don't want to return anything at all. */ { if ( slapi_uniqueIDCompareString(target_uniqueid, e->ep_entry->e_uniqueid) || - slapi_sdn_scope_test( backentry_get_sdn(e), &basesdn, scope )) + slapi_sdn_scope_test( backentry_get_sdn(e), basesdn, scope )) { /* check size limit */ if ( slimit >= 0 ) @@ -1540,7 +1544,6 @@ ldbm_back_next_search_entry_ext( Slapi_PBlock *pb, int use_extension ) } } bail: - slapi_sdn_done(&basesdn); return rc; }
diff --git a/ldap/servers/slapd/back-ldbm/ldif2ldbm.c b/ldap/servers/slapd/back-ldbm/ldif2ldbm.c index 4427a43..f6c3ce6 100644 --- a/ldap/servers/slapd/back-ldbm/ldif2ldbm.c +++ b/ldap/servers/slapd/back-ldbm/ldif2ldbm.c @@ -137,29 +137,18 @@ int ldbm_back_fetch_incl_excl(Slapi_PBlock *pb, char ***include, char ***exclude) { char **pb_incl, **pb_excl; - char subtreeDn[BUFSIZ]; - char *normSubtreeDn; - int i;
slapi_pblock_get(pb, SLAPI_LDIF2DB_INCLUDE, &pb_incl); slapi_pblock_get(pb, SLAPI_LDIF2DB_EXCLUDE, &pb_excl); + if ((NULL == include) || (NULL == exclude)) { + return 0; + } *include = *exclude = NULL;
- /* normalize */ - if (pb_excl) { - for (i = 0; pb_excl[i]; i++) { - PL_strncpyz(subtreeDn, pb_excl[i], sizeof(subtreeDn)); - normSubtreeDn = slapi_dn_normalize_case(subtreeDn); - charray_add(exclude, slapi_ch_strdup(normSubtreeDn)); - } - } - if (pb_incl) { - for (i = 0; pb_incl[i]; i++) { - PL_strncpyz(subtreeDn, pb_incl[i], sizeof(subtreeDn)); - normSubtreeDn = slapi_dn_normalize_case(subtreeDn); - charray_add(include, slapi_ch_strdup(normSubtreeDn)); - } - } + /* pb_incl/excl are both normalized */ + *exclude = slapi_ch_array_dup(pb_excl); + *include = slapi_ch_array_dup(pb_incl); + return (pb_incl || pb_excl); }
@@ -250,7 +239,8 @@ int add_op_attrs(Slapi_PBlock *pb, struct ldbminfo *li, struct backentry *ep, * caller via the status parameter. */ if (entryrdn_get_switch()) { /* subtree-rename: on */ - Slapi_DN sdn = {0};; + Slapi_DN sdn; + slapi_sdn_init(&sdn); slapi_sdn_set_dn_byval(&sdn, pdn); err = entryrdn_index_read(be, &sdn, &pid, NULL); slapi_sdn_done(&sdn); @@ -656,8 +646,10 @@ int ldbm_back_ldif2ldbm( Slapi_PBlock *pb ) /* initialize UniqueID generator - must be done once backends are started and event queue is initialized but before plugins are started */ /* This dn is normalize. */ - Slapi_DN *sdn = slapi_sdn_new_dn_byval ("cn=uniqueid generator,cn=config"); - int rc = uniqueIDGenInit (NULL, sdn, 0 /* use single thread mode */); + Slapi_DN *sdn = + slapi_sdn_new_ndn_byref ("cn=uniqueid generator,cn=config"); + int rc = uniqueIDGenInit (NULL, sdn /*const*/, + 0 /* use single thread mode */); slapi_sdn_free (&sdn); if (rc != UID_SUCCESS) { LDAPDebug( LDAP_DEBUG_ANY, @@ -783,9 +775,10 @@ static IDList *ldbm_fetch_subtrees(backend *be, char **include, int *err) IDList *idltotal = NULL, *idltmp; back_txn *txn = NULL; struct berval bv; - Slapi_DN sdn = {0}; /* Valid only if entryrdn_get_switch is true */ + Slapi_DN sdn; /* Used only if entryrdn_get_switch is true */
*err = 0; + slapi_sdn_init(&sdn); /* for each subtree spec... */ for (i = 0; include[i]; i++) { IDList *idl = NULL; @@ -794,6 +787,7 @@ static IDList *ldbm_fetch_subtrees(backend *be, char **include, int *err) char *nextdn = NULL; int matched = 0; int issubsuffix = 0; + /* * avoid a case that an include suffix is applied to the backend of * its sub suffix @@ -848,7 +842,6 @@ static IDList *ldbm_fetch_subtrees(backend *be, char **include, int *err) if (entryrdn_get_switch()) { /* subtree-rename: on */ slapi_sdn_set_dn_byval(&sdn, include[i]); *err = entryrdn_index_read(be, &sdn, &id, NULL); - slapi_sdn_done(&sdn); if (*err) { if (DB_NOTFOUND == *err) { LDAPDebug2Args(LDAP_DEBUG_ANY, @@ -861,6 +854,7 @@ static IDList *ldbm_fetch_subtrees(backend *be, char **include, int *err) "Reading %s failed on entryrdn; %d\n", include[i], *err ); } + slapi_sdn_done(&sdn); continue; } } else { @@ -895,6 +889,7 @@ static IDList *ldbm_fetch_subtrees(backend *be, char **include, int *err) } else { *err = ldbm_ancestorid_read(be, txn, id, &idl); } + slapi_sdn_done(&sdn); if (idl == NULL) { if (DB_NOTFOUND == *err) { LDAPDebug(LDAP_DEBUG_ANY, @@ -924,7 +919,7 @@ static IDList *ldbm_fetch_subtrees(backend *be, char **include, int *err) idl_free(idl); idltotal = idltmp; } - } + } /* for (i = 0; include[i]; i++) */
return idltotal; } @@ -1423,7 +1418,6 @@ ldbm_back_ldbm2ldif( Slapi_PBlock *pb ) ep = backentry_alloc(); if (entryrdn_get_switch()) { char *rdn = NULL; - int rc = 0;
/* rdn is allocated in get_value_from_string */ rc = get_value_from_string((const char *)data.dptr, "rdn", &rdn); @@ -1900,9 +1894,9 @@ ldbm_back_ldbm2index(Slapi_PBlock *pb)
/* create suffix list */ for (vlvidx = 0; vlvidx < numvlv; vlvidx++) { - char *s = slapi_ch_strdup(slapi_sdn_get_dn(vlvIndex_getBase(pvlv[vlvidx]))); - - s = slapi_dn_normalize_case(s); + char *s = + slapi_ch_strdup(slapi_sdn_get_ndn(vlvIndex_getBase(pvlv[vlvidx]))); + /* 's' is passed in */ charray_add(&suffix_list, s); } idl = ldbm_fetch_subtrees(be, suffix_list, &err); @@ -3448,8 +3442,7 @@ bail: * Update old DN format in entrydn and the leaf attr value to the new one * * The implementation would be similar to the upgradedb for new idl. - * Scan each entry, checking the entrydn value with the result of - * slapi_dn_normalize_ext_case(dn). + * Scan each entry, checking the entrydn value with the normalized dn. * If they don't match, * replace the old entrydn value with the new one in the entry * in id2entry.db4. diff --git a/ldap/servers/slapd/back-ldbm/misc.c b/ldap/servers/slapd/back-ldbm/misc.c index 6e350c9..78f1ed3 100644 --- a/ldap/servers/slapd/back-ldbm/misc.c +++ b/ldap/servers/slapd/back-ldbm/misc.c @@ -425,7 +425,8 @@ ldbm_txn_ruv_modify_context( Slapi_PBlock *pb, modify_context *mc )
slapi_pblock_get( pb, SLAPI_BACKEND, &be);
- bentry_addr.dn = NULL; + bentry_addr.sdn = NULL; + bentry_addr.udn = NULL; bentry_addr.uniqueid = uniqueid;
/* Note: if we find the bentry, it will stay locked until someone calls diff --git a/ldap/servers/slapd/back-ldbm/vlv_srch.c b/ldap/servers/slapd/back-ldbm/vlv_srch.c index c160507..d7e28c1 100644 --- a/ldap/servers/slapd/back-ldbm/vlv_srch.c +++ b/ldap/servers/slapd/back-ldbm/vlv_srch.c @@ -189,7 +189,7 @@ vlvSearch_init(struct vlvSearch* p, Slapi_PBlock *pb, const Slapi_Entry *e, ldbm slapi_pblock_set(pb, SLAPI_PLUGIN, inst->inst_be->be_database); slapi_pblock_get(pb, SLAPI_TXN, &txn.back_txn_txn);
- addr.dn = (char*)slapi_sdn_get_ndn (p->vlv_base); + addr.sdn = p->vlv_base; addr.uniqueid = NULL; e = find_entry( pb, inst->inst_be, &addr, &txn ); /* Check to see if the entry is absent. If it is, mark this search diff --git a/ldap/servers/slapd/bind.c b/ldap/servers/slapd/bind.c index 9670de2..12d6650 100644 --- a/ldap/servers/slapd/bind.c +++ b/ldap/servers/slapd/bind.c @@ -124,12 +124,13 @@ do_bind( Slapi_PBlock *pb ) int auth_response_requested = 0; int pw_response_requested = 0; char *rawdn = NULL; - char *dn = NULL, *saslmech = NULL; + const char *dn = NULL; + char *saslmech = NULL; struct berval cred = {0}; Slapi_Backend *be = NULL; ber_tag_t ber_rc; int rc = 0; - Slapi_DN sdn; + Slapi_DN *sdn = NULL; Slapi_Entry *referral; char errorbuf[BUFSIZ]; char **supported, **pmech; @@ -137,8 +138,6 @@ do_bind( Slapi_PBlock *pb ) Slapi_Entry *bind_target_entry = NULL; int auto_bind = 0; int minssf = 0; - char *test_bind_dn = NULL; - size_t dnlen = 0;
LDAPDebug( LDAP_DEBUG_TRACE, "do_bind\n", 0, 0, 0 );
@@ -174,7 +173,7 @@ do_bind( Slapi_PBlock *pb ) return; } /* Check if we should be performing strict validation. */ - if (config_get_dn_validate_strict()) { + if (rawdn && config_get_dn_validate_strict()) { /* check that the dn is formatted correctly */ rc = slapi_dn_syntax_check(pb, rawdn, 1); if (rc) { /* syntax check failed */ @@ -186,27 +185,21 @@ do_bind( Slapi_PBlock *pb ) return; } } - rc = slapi_dn_normalize_ext(rawdn, 0, &dn, &dnlen); - if (rc < 0) { - op_shared_log_error_access(pb, "BIND", rawdn?rawdn:"", - "invalid bind dn"); - send_ldap_result(pb, LDAP_INVALID_DN_SYNTAX, - NULL, "invalid bind dn", 0, NULL); - slapi_ch_free_string(&rawdn); + sdn = slapi_sdn_new_dn_passin(rawdn); + dn = slapi_sdn_get_dn(sdn); + if (rawdn && (strlen(rawdn) > 0) && (NULL == dn)) { + /* normalization failed */ + op_shared_log_error_access(pb, "BIND", rawdn, "invalid bind dn"); + send_ldap_result(pb, LDAP_INVALID_DN_SYNTAX, NULL, + "invalid bind dn", 0, NULL); + slapi_sdn_free(&sdn); return; - } else if (rc > 0) { /* if rc == 0, rawdn is passed in */ - slapi_ch_free_string(&rawdn); - } else { /* rc == 0; rawdn is passed in; not null terminated */ - *(dn + dnlen) = '\0'; } - - slapi_sdn_init_dn_passin(&sdn, dn); - LDAPDebug( LDAP_DEBUG_TRACE, "BIND dn="%s" method=%d version=%d\n", - dn, method, version ); + dn?dn:"empty", method, version );
/* target spec is used to decide which plugins are applicable for the operation */ - operation_set_target_spec (pb->pb_op, &sdn); + operation_set_target_spec (pb->pb_op, sdn);
switch ( method ) { case LDAP_AUTH_SASL: @@ -214,7 +207,7 @@ do_bind( Slapi_PBlock *pb ) LDAPDebug( LDAP_DEBUG_ANY, "got SASL credentials from LDAPv2 client\n", 0, 0, 0 ); - log_bind_access (pb, slapi_sdn_get_dn (&sdn), method, version, saslmech, "SASL credentials only in LDAPv3"); + log_bind_access (pb, dn?dn:"empty", method, version, saslmech, "SASL credentials only in LDAPv3"); send_ldap_result( pb, LDAP_PROTOCOL_ERROR, NULL, "SASL credentials only in LDAPv3", 0, NULL ); goto free_and_return; @@ -243,7 +236,7 @@ do_bind( Slapi_PBlock *pb ) "LDAPv2-style kerberos authentication received " "on LDAPv3 connection."; LDAPDebug( LDAP_DEBUG_ANY, kmsg, 0, 0, 0 ); - log_bind_access (pb, slapi_sdn_get_dn (&sdn), method, version, saslmech, kmsg); + log_bind_access (pb, dn?dn:"empty", method, version, saslmech, kmsg); send_ldap_result( pb, LDAP_PROTOCOL_ERROR, NULL, kmsg, 0, NULL ); goto free_and_return; @@ -256,7 +249,7 @@ do_bind( Slapi_PBlock *pb ) } break; default: - log_bind_access (pb, slapi_sdn_get_dn (&sdn), method, version, saslmech, "Unknown bind method"); + log_bind_access (pb, dn?dn:"empty", method, version, saslmech, "Unknown bind method"); send_ldap_result( pb, LDAP_PROTOCOL_ERROR, NULL, "Unknown bind method", 0, NULL ); goto free_and_return; @@ -265,7 +258,7 @@ do_bind( Slapi_PBlock *pb ) LDAPDebug( LDAP_DEBUG_ANY, "ber_scanf failed (op=Bind; params=Credentials)\n", 0, 0, 0 ); - log_bind_access (pb, slapi_sdn_get_dn (&sdn), method, version, saslmech, "decoding error"); + log_bind_access (pb, dn?dn:"empty", method, version, saslmech, "decoding error"); send_ldap_result( pb, LDAP_PROTOCOL_ERROR, NULL, "decoding error", 0, NULL ); goto free_and_return; @@ -284,7 +277,7 @@ do_bind( Slapi_PBlock *pb )
if (( err = get_ldapmessage_controls( pb, ber, &reqctrls )) != 0 ) { - log_bind_access (pb, slapi_sdn_get_dn (&sdn), method, + log_bind_access (pb, dn?dn:"empty", method, version, saslmech, "failed to parse LDAP controls"); send_ldap_result( pb, err, NULL, NULL, 0, NULL ); goto free_and_return; @@ -316,8 +309,8 @@ do_bind( Slapi_PBlock *pb ) { auto_bind = 1; /* flag the bind method */ dn = slapi_ch_strdup(pb->pb_conn->c_dn); - slapi_sdn_done(&sdn); - slapi_sdn_init_dn_passin(&sdn,dn); + slapi_sdn_free(&sdn); + sdn = slapi_sdn_new_dn_passin(dn); } } #endif /* ENABLE_AUTOBIND */ @@ -330,7 +323,7 @@ do_bind( Slapi_PBlock *pb ) pb->pb_conn->c_needpw = 0; PR_Unlock( pb->pb_conn->c_mutex );
- log_bind_access(pb, dn, method, version, saslmech, NULL); + log_bind_access(pb, dn?dn:"empty", method, version, saslmech, NULL);
switch ( version ) { case LDAP_VERSION2: @@ -372,9 +365,9 @@ do_bind( Slapi_PBlock *pb ) version, method, dn ); pb->pb_conn->c_ldapversion = version;
- isroot = slapi_dn_isroot( slapi_sdn_get_ndn(&sdn) ); + isroot = slapi_dn_isroot( slapi_sdn_get_ndn(sdn) ); slapi_pblock_set( pb, SLAPI_REQUESTOR_ISROOT, &isroot ); - slapi_pblock_set( pb, SLAPI_BIND_TARGET, (void*)slapi_sdn_get_ndn(&sdn) ); + slapi_pblock_set( pb, SLAPI_BIND_TARGET_SDN, (void*)sdn ); slapi_pblock_set( pb, SLAPI_BIND_METHOD, &method ); slapi_pblock_set( pb, SLAPI_BIND_SASLMECHANISM, saslmech ); slapi_pblock_set( pb, SLAPI_BIND_CREDENTIALS, &cred ); @@ -613,9 +606,9 @@ do_bind( Slapi_PBlock *pb ) slapi_value_init_berval(&cv,&cred);
/* right dn and passwd - authorize */ - if ( is_root_dn_pw( slapi_sdn_get_ndn(&sdn), &cv )) { + if ( is_root_dn_pw( slapi_sdn_get_ndn(sdn), &cv )) { bind_credentials_set( pb->pb_conn, SLAPD_AUTH_SIMPLE, - slapi_ch_strdup( slapi_sdn_get_ndn(&sdn) ), + slapi_ch_strdup( slapi_sdn_get_ndn(sdn) ), NULL, NULL, NULL , NULL);
/* right dn, wrong passwd - reject with invalid creds */ @@ -635,7 +628,7 @@ do_bind( Slapi_PBlock *pb ) if ( auth_response_requested ) { slapi_add_auth_response_control( pb, ( cred.bv_len == 0 ) ? "" : - slapi_sdn_get_ndn(&sdn)); + slapi_sdn_get_ndn(sdn)); } send_ldap_result( pb, LDAP_SUCCESS, NULL, NULL, 0, NULL );
@@ -687,7 +680,7 @@ do_bind( Slapi_PBlock *pb )
/* get the entry now, so that we can give it to slapi_check_account_lock and reslimit_update_from_dn */ if (! slapi_be_is_flag_set(be, SLAPI_BE_FLAG_REMOTE_DATA)) { - bind_target_entry = get_entry(pb, slapi_sdn_get_ndn(&sdn)); + bind_target_entry = get_entry(pb, slapi_sdn_get_ndn(sdn)); rc = slapi_check_account_lock ( pb, bind_target_entry, pw_response_requested, 1, 1); }
@@ -730,11 +723,11 @@ do_bind( Slapi_PBlock *pb ) if(!auto_bind) bind_credentials_set( pb->pb_conn, authtype, slapi_ch_strdup( - slapi_sdn_get_ndn(&sdn)), + slapi_sdn_get_ndn(sdn)), NULL, NULL, NULL, bind_target_entry ); if ( auth_response_requested ) { slapi_add_auth_response_control( pb, - slapi_sdn_get_ndn(&sdn)); + slapi_sdn_get_ndn(sdn)); } } else { /* anonymous */ /* set bind creds here so anonymous limits are set */ @@ -803,16 +796,12 @@ do_bind( Slapi_PBlock *pb ) free_and_return:; if (be) slapi_be_Unlock(be); - slapi_pblock_get(pb, SLAPI_BIND_TARGET, &test_bind_dn); - if (test_bind_dn != slapi_sdn_get_ndn(&sdn)) { - /* set in sasl bind or some other bind plugin */ - slapi_ch_free_string(&test_bind_dn); - } - slapi_sdn_done(&sdn); + slapi_pblock_get(pb, SLAPI_BIND_TARGET_SDN, &sdn); + slapi_sdn_free(&sdn); slapi_ch_free_string( &saslmech ); slapi_ch_free( (void **)&cred.bv_val ); - if ( bind_target_entry != NULL ) - slapi_entry_free(bind_target_entry); + if ( bind_target_entry != NULL ) + slapi_entry_free(bind_target_entry); }
diff --git a/ldap/servers/slapd/bulk_import.c b/ldap/servers/slapd/bulk_import.c index 717ff47..cb35988 100644 --- a/ldap/servers/slapd/bulk_import.c +++ b/ldap/servers/slapd/bulk_import.c @@ -67,7 +67,7 @@ static int process_bulk_import_op (Slapi_PBlock *pb, int state, Slapi_Entry *e); SLAPI_CONNECTION -- connection over which bulk import is coming SLAPI_BACKEND -- the backend being imported or - SLAPI_TARGET_DN that contains root of the imported area. + SLAPI_TARGET_SDN that contains root of the imported area. The function returns LDAP_SUCCESS or LDAP error code */
@@ -80,7 +80,7 @@ int slapi_start_bulk_import (Slapi_PBlock *pb) SLAPI_CONNECTION -- connection over which bulk import is coming SLAPI_BACKEND -- the backend being imported or - SLAPI_TARGET_DN that contains root of the imported area. + SLAPI_TARGET_SDN that contains root of the imported area. The function returns LDAP_SUCCESS or LDAP error code */ int slapi_stop_bulk_import (Slapi_PBlock *pb) @@ -103,9 +103,7 @@ process_bulk_import_op (Slapi_PBlock *pb, int state, Slapi_Entry *e) { int rc; Slapi_Backend *be = NULL; - char *dn = NULL; - Slapi_DN sdn; - const Slapi_DN *target_sdn = NULL; + Slapi_DN *target_sdn = NULL;
if (pb == NULL) { @@ -125,29 +123,27 @@ process_bulk_import_op (Slapi_PBlock *pb, int state, Slapi_Entry *e) /* try to get dn to select backend */ if (e) { - target_sdn = slapi_entry_get_sdn_const (e); - be = slapi_be_select (target_sdn); + target_sdn = slapi_entry_get_sdn(e); } else { - slapi_sdn_init(&sdn); - slapi_pblock_get (pb, SLAPI_TARGET_DN, &dn); - if (dn) - { - slapi_sdn_init_dn_byref(&sdn, dn); - be = slapi_be_select (&sdn); - target_sdn = &sdn; + slapi_pblock_get (pb, SLAPI_TARGET_SDN, &target_sdn); + if (NULL == target_sdn) { + slapi_log_error(SLAPI_LOG_FATAL, NULL, + "process_bulk_import_op: NULL target sdn\n"); + return LDAP_OPERATIONS_ERROR; } } + be = slapi_be_select (target_sdn);
if (be) { - if (state == SLAPI_BI_STATE_START && (!slapi_be_issuffix(be, target_sdn))) - { - slapi_log_error(SLAPI_LOG_FATAL, NULL, - "process_bulk_import_op: wrong backend suffix\n"); - return LDAP_OPERATIONS_ERROR; - } + if (state == SLAPI_BI_STATE_START && (!slapi_be_issuffix(be, target_sdn))) + { + slapi_log_error(SLAPI_LOG_FATAL, NULL, + "process_bulk_import_op: wrong backend suffix\n"); + return LDAP_OPERATIONS_ERROR; + } slapi_pblock_set (pb, SLAPI_BACKEND, be); } else @@ -155,9 +151,6 @@ process_bulk_import_op (Slapi_PBlock *pb, int state, Slapi_Entry *e) slapi_log_error(SLAPI_LOG_FATAL, NULL, "process_bulk_import_op: NULL backend\n"); return LDAP_OPERATIONS_ERROR; } - - if (NULL == e) - slapi_sdn_done (&sdn); }
if (be->be_wire_import == NULL) diff --git a/ldap/servers/slapd/charray.c b/ldap/servers/slapd/charray.c index 30c64ac..1bb084f 100644 --- a/ldap/servers/slapd/charray.c +++ b/ldap/servers/slapd/charray.c @@ -472,3 +472,24 @@ charray_get_index(char **array, char *s) } return -1; } + +int +charray_normdn_add(char ***chararray, char *dn, char *errstr) +{ + int rc = 0; + size_t len = 0; + char *normdn = NULL; + rc = slapi_dn_normalize_ext(dn, 0, &normdn, &len); + if (rc < 0) { + LDAPDebug2Args(LDAP_DEBUG_ANY, "Invalid dn: "%s" %s\n", + dn, errstr?errstr:""); + return rc; + } else if (0 == rc) { + /* rc == 0; optarg_extawdn is passed in; + * not null terminated */ + *(dn + len) = '\0'; + normdn = slapi_ch_strdup(dn); + } + charray_add(chararray, slapi_dn_ignore_case(normdn)); + return rc; +} diff --git a/ldap/servers/slapd/compare.c b/ldap/servers/slapd/compare.c index 578d826..b5b28fb 100644 --- a/ldap/servers/slapd/compare.c +++ b/ldap/servers/slapd/compare.c @@ -66,8 +66,7 @@ do_compare( Slapi_PBlock *pb ) { BerElement *ber = pb->pb_op->o_ber; char *rawdn = NULL; - char *dn = NULL; - size_t len = 0; + const char *dn = NULL; struct ava ava = {0}; Slapi_Backend *be = NULL; int err; @@ -118,18 +117,16 @@ do_compare( Slapi_PBlock *pb ) return; } } - err = slapi_dn_normalize_ext(rawdn, 0, &dn, &len); - if (err < 0) { - op_shared_log_error_access(pb, "CMP", rawdn?rawdn:"", "invalid dn"); - send_ldap_result(pb, LDAP_INVALID_DN_SYNTAX, - NULL, "invalid dn", 0, NULL); - slapi_ch_free((void **) &rawdn); - return; - } else if (err > 0) { /* if rc == 0, rawdn is passed in */ - slapi_ch_free((void **) &rawdn); - } else { /* rc == 0; rawdn is passed in; not null terminated */ - *(dn + len) = '\0'; - } + slapi_sdn_init_dn_passin(&sdn, rawdn); + dn = slapi_sdn_get_dn(&sdn); + if (rawdn && (strlen(rawdn) > 0) && (NULL == dn)) { + /* normalization failed */ + op_shared_log_error_access(pb, "CMP", rawdn, "invalid dn"); + send_ldap_result(pb, LDAP_INVALID_DN_SYNTAX, NULL, + "invalid dn", 0, NULL); + slapi_sdn_done(&sdn); + return; + } /* * in LDAPv3 there can be optional control extensions on * the end of an LDAPMessage. we need to read them in and @@ -139,19 +136,17 @@ do_compare( Slapi_PBlock *pb ) send_ldap_result( pb, err, NULL, NULL, 0, NULL ); goto free_and_return; } - slapi_sdn_init_dn_passin(&sdn,dn); - dn = NULL; /* do not free - sdn owns it now */
/* target spec is used to decide which plugins are applicable for the operation */ operation_set_target_spec (pb->pb_op, &sdn);
LDAPDebug( LDAP_DEBUG_ARGS, "do_compare: dn (%s) attr (%s)\n", - dn, ava.ava_type, 0 ); + rawdn, ava.ava_type, 0 );
slapi_log_access( LDAP_DEBUG_STATS, "conn=%" NSPRIu64 " op=%d CMP dn="%s" attr="%s"\n", pb->pb_conn->c_connid, pb->pb_op->o_opid, - escape_string( dn, ebuf ), ava.ava_type ); + escape_string( rawdn, ebuf ), ava.ava_type );
/* * We could be serving multiple database backends. Select the @@ -188,7 +183,9 @@ do_compare( Slapi_PBlock *pb ) isroot = pb->pb_op->o_isroot;
slapi_pblock_set( pb, SLAPI_REQUESTOR_ISROOT, &isroot ); - slapi_pblock_set( pb, SLAPI_COMPARE_TARGET, (void*)slapi_sdn_get_ndn(&sdn) ); + /* EXCEPTION: compare target does not allocate memory. */ + /* target never be modified by plugins. */ + slapi_pblock_set( pb, SLAPI_COMPARE_TARGET_SDN, (void*)&sdn ); slapi_pblock_set( pb, SLAPI_COMPARE_TYPE, ava.ava_type); slapi_pblock_set( pb, SLAPI_COMPARE_VALUE, &ava.ava_value ); /* @@ -216,6 +213,5 @@ free_and_return:; if (be) slapi_be_Unlock(be); slapi_sdn_done(&sdn); - slapi_ch_free_string(&dn); ava_done( &ava ); } diff --git a/ldap/servers/slapd/delete.c b/ldap/servers/slapd/delete.c index fa7dbe3..693efa1 100644 --- a/ldap/servers/slapd/delete.c +++ b/ldap/servers/slapd/delete.c @@ -72,8 +72,6 @@ do_delete( Slapi_PBlock *pb ) Slapi_Operation *operation; BerElement *ber; char *rawdn = NULL; - char *dn = NULL; - size_t dnlen = 0; int err = 0;
LDAPDebug( LDAP_DEBUG_TRACE, "do_delete\n", 0, 0, 0 ); @@ -107,22 +105,9 @@ do_delete( Slapi_PBlock *pb ) "strict: invalid dn"); send_ldap_result(pb, LDAP_INVALID_DN_SYNTAX, NULL, "invalid dn", 0, NULL); - slapi_ch_free_string(&rawdn); goto free_and_return; } } - err = slapi_dn_normalize_ext(rawdn, 0, &dn, &dnlen); - if (err < 0) { - op_shared_log_error_access(pb, "DEL", rawdn?rawdn:"", "invalid dn"); - send_ldap_result(pb, LDAP_INVALID_DN_SYNTAX, - NULL, "invalid dn", 0, NULL); - slapi_ch_free_string(&rawdn); - goto free_and_return; - } else if (err > 0) { /* if err == 0, rawdn is passed in */ - slapi_ch_free_string(&rawdn); - } else { /* err == 0; rawdn is passed in; not null terminated */ - *(dn + dnlen) = '\0'; - }
/* * in LDAPv3 there can be optional control extensions on @@ -130,20 +115,20 @@ do_delete( Slapi_PBlock *pb ) * pass them to the backend. */ if ( (err = get_ldapmessage_controls( pb, ber, NULL )) != 0 ) { - op_shared_log_error_access (pb, "DEL", dn, "decoding error"); + op_shared_log_error_access (pb, "DEL", rawdn, "decoding error"); send_ldap_result( pb, err, NULL, NULL, 0, NULL ); goto free_and_return; }
- LDAPDebug( LDAP_DEBUG_ARGS, "do_delete: dn (%s)\n", dn, 0, 0 ); - + LDAPDebug1Arg( LDAP_DEBUG_ARGS, "do_delete: dn (%s)\n", rawdn ); + slapi_pblock_set( pb, SLAPI_REQUESTOR_ISROOT, &pb->pb_op->o_isroot ); - slapi_pblock_set( pb, SLAPI_ORIGINAL_TARGET, dn); + slapi_pblock_set( pb, SLAPI_ORIGINAL_TARGET, rawdn);
op_shared_delete (pb);
free_and_return:; - slapi_ch_free ((void**)&dn); + slapi_ch_free ((void**)&rawdn); }
/* This function is used to issue internal delete operation @@ -158,7 +143,7 @@ slapi_delete_internal(const char *idn, LDAPControl **controls, int dummy) int opresult;
pblock_init (&pb); - + slapi_delete_internal_set_pb (&pb, idn, controls, NULL, plugin_get_default_component_id(), 0);
delete_internal_pb (&pb); @@ -201,22 +186,26 @@ int slapi_delete_internal_pb (Slapi_PBlock *pb) }
/* Initialize a pblock for a call to slapi_delete_internal_pb() */ -void slapi_delete_internal_set_pb (Slapi_PBlock *pb, const char *dn, LDAPControl **controls, const char *uniqueid, - Slapi_ComponentId *plugin_identity, int operation_flags) +void +slapi_delete_internal_set_pb (Slapi_PBlock *pb, + const char *rawdn, + LDAPControl **controls, const char *uniqueid, + Slapi_ComponentId *plugin_identity, + int operation_flags) { Operation *op; PR_ASSERT (pb != NULL); - if (pb == NULL || dn == NULL) + if (pb == NULL || rawdn == NULL) { slapi_log_error(SLAPI_LOG_FATAL, NULL, "slapi_delete_internal_set_pb: NULL parameter\n"); return; }
- op = internal_operation_new(SLAPI_OPERATION_DELETE,operation_flags); + op = internal_operation_new(SLAPI_OPERATION_DELETE,operation_flags); slapi_pblock_set(pb, SLAPI_OPERATION, op); - slapi_pblock_set(pb, SLAPI_ORIGINAL_TARGET, (void*)dn); - slapi_pblock_set(pb, SLAPI_CONTROLS_ARG, controls); + slapi_pblock_set(pb, SLAPI_ORIGINAL_TARGET, (void*)rawdn); + slapi_pblock_set(pb, SLAPI_CONTROLS_ARG, controls); if (uniqueid) { slapi_pblock_set(pb, SLAPI_TARGET_UNIQUEID, (void*)uniqueid); @@ -259,11 +248,12 @@ static int delete_internal_pb (Slapi_PBlock *pb)
static void op_shared_delete (Slapi_PBlock *pb) { - char *dn; + char *rawdn = NULL; + const char *dn = NULL; Slapi_Backend *be = NULL; char ebuf[ BUFSIZ ]; int internal_op; - Slapi_DN sdn; + Slapi_DN *sdn = NULL; Slapi_Operation *operation; Slapi_Entry *referral; Slapi_Entry *ecopy = NULL; @@ -274,15 +264,23 @@ static void op_shared_delete (Slapi_PBlock *pb) int proxy_err = LDAP_SUCCESS; char *errtext = NULL;
- slapi_pblock_get(pb, SLAPI_ORIGINAL_TARGET, &dn); + slapi_pblock_get(pb, SLAPI_ORIGINAL_TARGET, &rawdn); slapi_pblock_get(pb, SLAPI_OPERATION, &operation); internal_op= operation_is_flag_set(operation, OP_FLAG_INTERNAL);
- slapi_sdn_init_dn_byref(&sdn,dn); - slapi_pblock_set(pb, SLAPI_DELETE_TARGET, (void*)slapi_sdn_get_ndn (&sdn)); + sdn = slapi_sdn_new_dn_byval(rawdn); + dn = slapi_sdn_get_dn(sdn); + slapi_pblock_set(pb, SLAPI_DELETE_TARGET_SDN, (void*)sdn); + if (rawdn && (strlen(rawdn) > 0) && (NULL == dn)) { + /* normalization failed */ + op_shared_log_error_access(pb, "DEL", rawdn, "invalid dn"); + send_ldap_result(pb, LDAP_INVALID_DN_SYNTAX, + NULL, "invalid dn", 0, NULL); + goto free_and_return; + }
/* target spec is used to decide which plugins are applicable for the operation */ - operation_set_target_spec (operation, &sdn); + operation_set_target_spec (operation, sdn);
/* get the proxy auth dn if the proxy auth control is present */ proxy_err = proxyauth_get_dn(pb, &proxydn, &errtext); @@ -299,7 +297,7 @@ static void op_shared_delete (Slapi_PBlock *pb) slapi_log_access(LDAP_DEBUG_STATS, "conn=%" NSPRIu64 " op=%d DEL dn="%s"%s\n", pb->pb_conn->c_connid, pb->pb_op->o_opid, - escape_string(dn, ebuf), + escape_string(slapi_sdn_get_dn(sdn), ebuf), proxystr ? proxystr: ""); } else @@ -307,7 +305,7 @@ static void op_shared_delete (Slapi_PBlock *pb) slapi_log_access(LDAP_DEBUG_ARGS, "conn=%s op=%d DEL dn="%s"%s\n", LOG_INTERNAL_OP_CON_ID, LOG_INTERNAL_OP_OP_ID, - escape_string(dn, ebuf), + escape_string(slapi_sdn_get_dn(sdn), ebuf), proxystr ? proxystr: ""); } } @@ -398,6 +396,7 @@ free_and_return: slapi_be_Unlock(be); } { + char *coldn = NULL; Slapi_Entry *epre = NULL, *eparent = NULL; slapi_pblock_get(pb, SLAPI_ENTRY_PRE_OP, &epre); slapi_pblock_get(pb, SLAPI_DELETE_GLUE_PARENT_ENTRY, &eparent); @@ -408,10 +407,12 @@ free_and_return: } slapi_entry_free(epre); slapi_entry_free(eparent); + slapi_pblock_get(pb, SLAPI_URP_NAMING_COLLISION_DN, &coldn); + slapi_ch_free_string(&coldn); } - slapi_pblock_get(pb, SLAPI_URP_NAMING_COLLISION_DN, &dn); - slapi_ch_free((void **)&dn); - slapi_sdn_done(&sdn); + + slapi_pblock_get(pb, SLAPI_DELETE_TARGET_SDN, &sdn); + slapi_sdn_free(&sdn); slapi_ch_free_string(&proxydn); slapi_ch_free_string(&proxystr); } diff --git a/ldap/servers/slapd/dn.c b/ldap/servers/slapd/dn.c index 1912f70..e5b9db9 100644 --- a/ldap/servers/slapd/dn.c +++ b/ldap/servers/slapd/dn.c @@ -190,7 +190,6 @@ substr_dn_normalize_orig( char *dn, char *end ) char *d = NULL; char *s = NULL; char *typestart = NULL; - char *rdnbegin = NULL; char *lastesc = NULL; int gotesc = 0; int state = B4TYPE; @@ -231,7 +230,6 @@ substr_dn_normalize_orig( char *dn, char *end ) value_separator = NULL; value = d; state = ( *s == '"' ) ? INQUOTEDVALUE : INVALUE1ST; - rdnbegin = d; lastesc = NULL; *d++ = *s; } @@ -545,6 +543,9 @@ slapi_dn_normalize_ext(char *src, size_t src_len, char **dest, size_t *dest_len) rc = 0; } } + if (0 == src_len) { /* src == "" */ + goto bail; + }
ends = src + src_len; endd = *dest + *dest_len; @@ -1041,7 +1042,7 @@ slapi_dn_normalize_ext(char *src, size_t src_len, char **dest, size_t *dest_len) break; default: LDAPDebug( LDAP_DEBUG_ANY, - "slapi_dn_normalize - unknown state %d\n", state, 0, 0 ); + "slapi_dn_normalize_ext - unknown state %d\n", state, 0, 0 ); break; } } @@ -1116,6 +1117,39 @@ slapi_create_dn_string(const char *fmt, ...) return dest; }
+char * +slapi_create_rdn_value(const char *fmt, ...) +{ + char *src = NULL; + char *dest = NULL; + size_t dest_len = 0; + va_list ap; + int rc = 0; + char *dnfmt; + + if (NULL == fmt) { + return NULL; + } + + dnfmt = slapi_ch_smprintf("cn=%s", fmt); + va_start(ap, fmt); + src = PR_vsmprintf(dnfmt, ap); + va_end(ap); + slapi_ch_free_string(&dnfmt); + + rc = slapi_dn_normalize_ext(src, strlen(src), &dest, &dest_len); + if (rc == 0) { /* src is passed in. */ + *(dest + dest_len) = '\0'; + dest = slapi_ch_strdup(dest + 3); + } else if (rc > 0) { + char *odest = dest; + dest = slapi_ch_strdup(dest + 3); + slapi_ch_free_string(&odest); + } + slapi_ch_free_string(&src); + return dest; +} + /* * Append previous AV to the attribute value array if multivalued RDN. * We use a stack based array at first and if we overflow that, we @@ -1370,12 +1404,13 @@ dn_ignore_case_to_end( char *dn, char *end ) * slapi_dn_normalize_case - put dn into a canonical form suitable for storing * in a hash database. this involves normalizing the case as well as * the format. the dn is normalized in place as well as returned. + * (DEPRECATED) */
char * slapi_dn_normalize_case( char *dn ) { - /* normalize format */ + /* normalize format (DEPRECATED) noop */ slapi_dn_normalize( dn );
/* normalize case */ @@ -1698,6 +1733,9 @@ PR_DEFINE_COUNTER(slapi_sdn_counter_dn_exist); PR_DEFINE_COUNTER(slapi_sdn_counter_ndn_created); PR_DEFINE_COUNTER(slapi_sdn_counter_ndn_deleted); PR_DEFINE_COUNTER(slapi_sdn_counter_ndn_exist); +PR_DEFINE_COUNTER(slapi_sdn_counter_udn_created); +PR_DEFINE_COUNTER(slapi_sdn_counter_udn_deleted); +PR_DEFINE_COUNTER(slapi_sdn_counter_udn_exist);
static void sdn_create_counters() @@ -1711,12 +1749,16 @@ sdn_create_counters() PR_CREATE_COUNTER(slapi_sdn_counter_ndn_created,"Slapi_DN","internal_ndn_created",""); PR_CREATE_COUNTER(slapi_sdn_counter_ndn_deleted,"Slapi_DN","internal_ndn_deleted",""); PR_CREATE_COUNTER(slapi_sdn_counter_ndn_exist,"Slapi_DN","internal_ndn_exist",""); + PR_CREATE_COUNTER(slapi_sdn_counter_udn_created,"Slapi_DN","internal_udn_created",""); + PR_CREATE_COUNTER(slapi_sdn_counter_udn_deleted,"Slapi_DN","internal_udn_deleted",""); + PR_CREATE_COUNTER(slapi_sdn_counter_udn_exist,"Slapi_DN","internal_udn_exist",""); counters_created= 1; }
#define FLAG_ALLOCATED 0 #define FLAG_DN 1 #define FLAG_NDN 2 +#define FLAG_UDN 3
Slapi_DN * slapi_sdn_new() @@ -1730,10 +1772,18 @@ slapi_sdn_new() return sdn; }
+/* + * WARNING: + * Do not call slapi_sdn_init and its sibling APIs against Slapi_DN + * allocated by slapi_sdn_new. slapi_sdn_init clears all bits in the flag. + * If sdn is allocated by slapi_sdn_new, the FLAG_ALLOCATED bit is cleared + * and slapi_sdn_free won't free Slapi_DN. + */ Slapi_DN * slapi_sdn_init(Slapi_DN *sdn) { sdn->flag= 0; + sdn->udn= NULL; sdn->dn= NULL; sdn->ndn= NULL; sdn->ndn_len=0; @@ -1748,7 +1798,7 @@ Slapi_DN * slapi_sdn_init_dn_byref(Slapi_DN *sdn,const char *dn) { slapi_sdn_init(sdn); - slapi_sdn_set_dn_byref(sdn,dn); + slapi_sdn_set_dn_byref(sdn, dn); return sdn; }
@@ -1768,20 +1818,33 @@ slapi_sdn_init_dn_passin(Slapi_DN *sdn,const char *dn) return sdn; }
-/* use when dn is normalized previously */ +/* use when dn is already normalized (but case is yet touched) */ Slapi_DN * -slapi_sdn_init_dn_ndn_byref(Slapi_DN *sdn,const char *dn) { - slapi_sdn_init(sdn); - slapi_sdn_set_dn_byref(sdn,dn); - /* slapi_sdn_set_ndn_byref nulls out dn set in above statement */ - sdn->flag= slapi_unsetbit_uchar(sdn->flag,FLAG_NDN); - sdn->ndn= dn; - if(dn == NULL) { - sdn->ndn_len=0; - } else { - sdn->ndn_len=strlen(dn); - } - return sdn; +slapi_sdn_init_normdn_byref(Slapi_DN *sdn, const char *dn) +{ + slapi_sdn_init(sdn); + if(dn == NULL) { + sdn->ndn_len = 0; + } else { + sdn->ndn_len = strlen(dn); + sdn->dn = dn; + } + return sdn; +} + +/* use when dn is already normalized (but case is yet touched) */ +Slapi_DN * +slapi_sdn_init_normdn_passin(Slapi_DN *sdn, const char *dn) +{ + slapi_sdn_init(sdn); + if(dn == NULL) { + sdn->ndn_len = 0; + } else { + sdn->ndn_len = strlen(dn); + sdn->dn = dn; + sdn->flag = slapi_setbit_uchar(sdn->flag, FLAG_DN); + } + return sdn; }
Slapi_DN * @@ -1789,7 +1852,7 @@ slapi_sdn_init_ndn_byref(Slapi_DN *sdn,const char *dn) { slapi_sdn_init(sdn); slapi_sdn_set_ndn_byref(sdn,dn); - return sdn; + return sdn; }
Slapi_DN * @@ -1797,7 +1860,7 @@ slapi_sdn_init_ndn_byval(Slapi_DN *sdn,const char *dn) { slapi_sdn_init(sdn); slapi_sdn_set_ndn_byval(sdn,dn); - return sdn; + return sdn; }
Slapi_DN * @@ -1845,16 +1908,46 @@ slapi_sdn_new_ndn_byref(const char *ndn) return sdn; }
+/* use when dn is already normalized */ +Slapi_DN * +slapi_sdn_new_normdn_byref(const char *normdn) +{ + Slapi_DN *sdn = slapi_sdn_new(); + slapi_sdn_set_normdn_byref(sdn, normdn); + SDN_DUMP( sdn, "slapi_sdn_new_normdn_byref"); + return sdn; +} + +/* use when dn is already normalized */ +Slapi_DN * +slapi_sdn_new_normdn_passin(const char *normdn) +{ + Slapi_DN *sdn = slapi_sdn_new(); + slapi_sdn_set_normdn_passin(sdn, normdn); + SDN_DUMP( sdn, "slapi_sdn_new_normdn_passin"); + return sdn; +} + +/* use when dn is already normalized */ +Slapi_DN * +slapi_sdn_new_normdn_byval(const char *normdn) +{ + Slapi_DN *sdn = slapi_sdn_new(); + slapi_sdn_set_normdn_byval(sdn, normdn); + SDN_DUMP( sdn, "slapi_sdn_new_normdn_byval"); + return sdn; +} + Slapi_DN * slapi_sdn_set_dn_byval(Slapi_DN *sdn, const char *dn) { slapi_sdn_done(sdn); - sdn->flag= slapi_setbit_uchar(sdn->flag,FLAG_DN); + sdn->flag= slapi_setbit_uchar(sdn->flag,FLAG_UDN); if(dn!=NULL) { - sdn->dn= slapi_ch_strdup(dn); - PR_INCREMENT_COUNTER(slapi_sdn_counter_dn_created); - PR_INCREMENT_COUNTER(slapi_sdn_counter_dn_exist); + sdn->udn= slapi_ch_strdup(dn); + PR_INCREMENT_COUNTER(slapi_sdn_counter_udn_created); + PR_INCREMENT_COUNTER(slapi_sdn_counter_udn_exist); } return sdn; } @@ -1863,8 +1956,8 @@ Slapi_DN * slapi_sdn_set_dn_byref(Slapi_DN *sdn, const char *dn) { slapi_sdn_done(sdn); - sdn->flag= slapi_unsetbit_uchar(sdn->flag,FLAG_DN); - sdn->dn= dn; + sdn->flag= slapi_unsetbit_uchar(sdn->flag,FLAG_UDN); + sdn->udn= dn; return sdn; }
@@ -1872,17 +1965,64 @@ Slapi_DN * slapi_sdn_set_dn_passin(Slapi_DN *sdn, const char *dn) { slapi_sdn_done(sdn); - sdn->flag= slapi_setbit_uchar(sdn->flag,FLAG_DN); - sdn->dn= dn; + sdn->flag= slapi_setbit_uchar(sdn->flag,FLAG_UDN); + sdn->udn= dn; if(dn!=NULL) { - PR_INCREMENT_COUNTER(slapi_sdn_counter_dn_created); - PR_INCREMENT_COUNTER(slapi_sdn_counter_dn_exist); + PR_INCREMENT_COUNTER(slapi_sdn_counter_udn_created); + PR_INCREMENT_COUNTER(slapi_sdn_counter_udn_exist); } return sdn; }
Slapi_DN * +slapi_sdn_set_normdn_byref(Slapi_DN *sdn, const char *normdn) +{ + slapi_sdn_done(sdn); + sdn->flag = slapi_unsetbit_uchar(sdn->flag, FLAG_DN); + sdn->dn = normdn; + if(normdn == NULL) { + sdn->ndn_len = 0; + } else { + sdn->ndn_len = strlen(normdn); + } + return sdn; +} + +Slapi_DN * +slapi_sdn_set_normdn_passin(Slapi_DN *sdn, const char *normdn) +{ + slapi_sdn_done(sdn); + sdn->flag = slapi_setbit_uchar(sdn->flag, FLAG_DN); + sdn->dn = normdn; + if(normdn == NULL) { + sdn->ndn_len = 0; + } else { + sdn->ndn_len = strlen(normdn); + PR_INCREMENT_COUNTER(slapi_sdn_counter_dn_created); + PR_INCREMENT_COUNTER(slapi_sdn_counter_dn_exist); + } + return sdn; +} + +Slapi_DN * +slapi_sdn_set_normdn_byval(Slapi_DN *sdn, const char *normdn) +{ + slapi_sdn_done(sdn); + sdn->flag = slapi_setbit_uchar(sdn->flag, FLAG_DN); + if(normdn == NULL) { + sdn->dn = slapi_ch_strdup(normdn); + sdn->ndn_len = 0; + } else { + sdn->dn = slapi_ch_strdup(normdn); + sdn->ndn_len = strlen(normdn); + PR_INCREMENT_COUNTER(slapi_sdn_counter_dn_created); + PR_INCREMENT_COUNTER(slapi_sdn_counter_dn_exist); + } + return sdn; +} + +Slapi_DN * slapi_sdn_set_ndn_byval(Slapi_DN *sdn, const char *ndn) { slapi_sdn_done(sdn); @@ -1925,7 +2065,7 @@ slapi_sdn_set_rdn(Slapi_DN *sdn, const Slapi_RDN *rdn) else { /* NewDN= NewRDN + OldParent */ - char *parentdn= slapi_dn_parent(sdn->dn); + char *parentdn = slapi_dn_parent(slapi_sdn_get_dn(sdn)); char *newdn = slapi_ch_smprintf("%s,%s", rawrdn, parentdn); slapi_ch_free((void**)&parentdn); slapi_sdn_set_dn_passin(sdn,newdn); @@ -1939,7 +2079,7 @@ slapi_sdn_set_rdn(Slapi_DN *sdn, const Slapi_RDN *rdn) Slapi_DN * slapi_sdn_add_rdn(Slapi_DN *sdn, const Slapi_RDN *rdn) { - const char *rawrdn= slapi_rdn_get_rdn(rdn); + const char *rawrdn = slapi_rdn_get_rdn(rdn); if(slapi_sdn_isempty(sdn)) { slapi_sdn_set_dn_byval(sdn,rawrdn); @@ -1972,7 +2112,7 @@ slapi_sdn_set_parent(Slapi_DN *sdn, const Slapi_DN *parentdn) /* NewDN= OldRDN + NewParent */ Slapi_RDN rdn; const char *rawrdn; - slapi_rdn_init_dn(&rdn,sdn->dn); + slapi_rdn_init_dn(&rdn, slapi_sdn_get_dn(sdn)); rawrdn= slapi_rdn_get_rdn(&rdn); if(slapi_sdn_isempty(parentdn)) { @@ -1980,12 +2120,9 @@ slapi_sdn_set_parent(Slapi_DN *sdn, const Slapi_DN *parentdn) } else { - char *newdn; - newdn= slapi_ch_malloc(strlen(rawrdn)+1+strlen(parentdn->dn)+1); - strcpy( newdn, rawrdn ); - strcat( newdn, "," ); - strcat( newdn, parentdn->dn ); - slapi_sdn_set_dn_passin(sdn,newdn); + char *newdn = + slapi_ch_smprintf("%s,%s", rawrdn, slapi_sdn_get_dn(parentdn)); + slapi_sdn_set_dn_passin(sdn, newdn); } slapi_rdn_done(&rdn); } @@ -2005,7 +2142,6 @@ slapi_sdn_done(Slapi_DN *sdn) if(slapi_isbitset_uchar(sdn->flag,FLAG_DN)) { slapi_ch_free((void**)&(sdn->dn)); - sdn->flag= slapi_unsetbit_uchar(sdn->flag,FLAG_DN); PR_INCREMENT_COUNTER(slapi_sdn_counter_dn_deleted); PR_DECREMENT_COUNTER(slapi_sdn_counter_dn_exist); } @@ -2014,22 +2150,36 @@ slapi_sdn_done(Slapi_DN *sdn) sdn->dn= NULL; } } + sdn->flag= slapi_unsetbit_uchar(sdn->flag,FLAG_DN); if(sdn->ndn!=NULL) { if(slapi_isbitset_uchar(sdn->flag,FLAG_NDN)) { slapi_ch_free((void**)&(sdn->ndn)); - sdn->flag= slapi_unsetbit_uchar(sdn->flag,FLAG_NDN); - sdn->ndn_len=0; PR_INCREMENT_COUNTER(slapi_sdn_counter_ndn_deleted); PR_DECREMENT_COUNTER(slapi_sdn_counter_ndn_exist); } else { sdn->ndn= NULL; - sdn->ndn_len=0; } } + sdn->flag= slapi_unsetbit_uchar(sdn->flag,FLAG_NDN); + sdn->ndn_len=0; + if(sdn->udn!=NULL) + { + if(slapi_isbitset_uchar(sdn->flag,FLAG_UDN)) + { + slapi_ch_free((void**)&(sdn->udn)); + PR_INCREMENT_COUNTER(slapi_sdn_counter_udn_deleted); + PR_DECREMENT_COUNTER(slapi_sdn_counter_udn_exist); + } + else + { + sdn->udn= NULL; + } + } + sdn->flag= slapi_unsetbit_uchar(sdn->flag,FLAG_UDN); }
void @@ -2037,9 +2187,11 @@ slapi_sdn_free(Slapi_DN **sdn) { if(sdn!=NULL && *sdn!=NULL) { + int is_allocated = 0; SDN_DUMP( *sdn, "slapi_sdn_free"); + is_allocated = slapi_isbitset_uchar((*sdn)->flag, FLAG_ALLOCATED); slapi_sdn_done(*sdn); - if(slapi_isbitset_uchar((*sdn)->flag,FLAG_ALLOCATED)) + if(is_allocated) { slapi_ch_free((void**)sdn); PR_INCREMENT_COUNTER(slapi_sdn_counter_deleted); @@ -2051,43 +2203,75 @@ slapi_sdn_free(Slapi_DN **sdn) const char * slapi_sdn_get_dn(const Slapi_DN *sdn) { - return (sdn->dn!=NULL ? sdn->dn : sdn->ndn); + if (NULL == sdn) { + return NULL; + } + if (sdn->dn) { + return sdn->dn; + } else if (sdn->ndn) { + return sdn->ndn; + } else if (sdn->udn) { + char *udn = slapi_ch_strdup(sdn->udn); + char *normed = NULL; + size_t dnlen = 0; + Slapi_DN *ncsdn = (Slapi_DN*)sdn; /* non-const Slapi_DN */ + int rc = slapi_dn_normalize_ext(udn, 0, &normed, &dnlen); + if (rc == 0) { /* udn is passed in */ + *(normed + dnlen) = '\0'; + ncsdn->dn = normed; + ncsdn->ndn_len = dnlen; + ncsdn->flag = slapi_setbit_uchar(sdn->flag, FLAG_DN); + PR_INCREMENT_COUNTER(slapi_sdn_counter_dn_created); + PR_INCREMENT_COUNTER(slapi_sdn_counter_dn_exist); + } else if (rc > 0) { /* rc > 0 */ + slapi_ch_free_string(&udn); + ncsdn->dn = normed; + ncsdn->ndn_len = dnlen; + ncsdn->flag = slapi_setbit_uchar(sdn->flag, FLAG_DN); + PR_INCREMENT_COUNTER(slapi_sdn_counter_dn_created); + PR_INCREMENT_COUNTER(slapi_sdn_counter_dn_exist); + } + /* else (rc < 0); normzlization failed. return NULL */ + return sdn->dn; + } else { + return NULL; + } }
const char * slapi_sdn_get_ndn(const Slapi_DN *sdn) { - if(sdn->ndn==NULL) - { - if(sdn->dn!=NULL) - { - char *p= slapi_ch_strdup(sdn->dn); - char *normed = NULL; - size_t dnlen = 0; - int rc = 0; - - Slapi_DN *ncsdn= (Slapi_DN*)sdn; /* non-const Slapi_DN */ - rc = slapi_dn_normalize_case_ext(p, 0, &normed, &dnlen); - if (rc < 0) { - /* we give up, just set dn to ndn */ - slapi_dn_ignore_case(p); /* ignore case */ - ncsdn->ndn = p; - ncsdn->ndn_len = strlen(p); - } else if (rc == 0) { /* p is passed in */ - *(normed + dnlen) = '\0'; - ncsdn->ndn = normed; - ncsdn->ndn_len = dnlen; - } else { /* rc > 0 */ - slapi_ch_free_string(&p); - ncsdn->ndn = normed; - ncsdn->ndn_len = dnlen; - } - ncsdn->flag= slapi_setbit_uchar(sdn->flag,FLAG_NDN); - PR_INCREMENT_COUNTER(slapi_sdn_counter_ndn_created); - PR_INCREMENT_COUNTER(slapi_sdn_counter_ndn_exist); - } + if (NULL == sdn) { + return NULL; + } + if (sdn->ndn) { + return sdn->ndn; + } else if (sdn->dn || sdn->udn) { + Slapi_DN *ncsdn = (Slapi_DN*)sdn; /* non-const Slapi_DN */ + char *ndn = slapi_ch_strdup(slapi_sdn_get_dn(sdn)); + slapi_dn_ignore_case(ndn); /* ignore case */ + ncsdn->ndn = ndn; + ncsdn->flag = slapi_setbit_uchar(sdn->flag, FLAG_NDN); + PR_INCREMENT_COUNTER(slapi_sdn_counter_ndn_created); + PR_INCREMENT_COUNTER(slapi_sdn_counter_ndn_exist); + return ndn; + } else { + return NULL; + } +} + +const char * +slapi_sdn_get_udn(const Slapi_DN *sdn) +{ + if (sdn->udn) { + return sdn->udn; + } else if (sdn->dn) { + return sdn->dn; + } else if (sdn->ndn) { + return sdn->ndn; + } else { + return NULL; } - return sdn->ndn; }
void @@ -2123,52 +2307,45 @@ Slapi_DN * slapi_sdn_dup(const Slapi_DN *sdn) { Slapi_DN *tmp; - SDN_DUMP( sdn, "slapi_sdn_dup"); - tmp=slapi_sdn_new_dn_byval(slapi_sdn_get_dn(sdn)); - /* can't use slapi_set_ndn_byval -- it nulls the dn */ - tmp->flag= slapi_setbit_uchar(tmp->flag,FLAG_NDN); - if(sdn->ndn!=NULL) - { - tmp->ndn= slapi_ch_strdup(sdn->ndn); - tmp->ndn_len=sdn->ndn_len; - } else tmp->ndn=NULL; + SDN_DUMP( sdn, "slapi_sdn_dup"); + tmp = slapi_sdn_new_normdn_byval(slapi_sdn_get_dn(sdn)); return tmp; }
void slapi_sdn_copy(const Slapi_DN *from, Slapi_DN *to) { - SDN_DUMP( from, "slapi_sdn_copy from"); - SDN_DUMP( to, "slapi_sdn_copy to"); + SDN_DUMP( from, "slapi_sdn_copy from"); + SDN_DUMP( to, "slapi_sdn_copy to"); slapi_sdn_done(to); - slapi_sdn_set_dn_byval(to,slapi_sdn_get_dn(from)); + slapi_sdn_set_normdn_byval(to, slapi_sdn_get_dn(from)); }
int slapi_sdn_compare( const Slapi_DN *sdn1, const Slapi_DN *sdn2 ) { - int rc; - const char *ndn1= slapi_sdn_get_ndn(sdn1); - const char *ndn2= slapi_sdn_get_ndn(sdn2); + int rc; + const char *ndn1= slapi_sdn_get_ndn(sdn1); + const char *ndn2= slapi_sdn_get_ndn(sdn2); if(ndn1==ndn2) { rc= 0; } else { - if(ndn1==NULL) + if(ndn1==NULL) { rc= -1; } else { - if(ndn2==NULL) - { - rc= 1; - } - else - { - rc= strcmp(ndn1,ndn2); + if(ndn2==NULL) + { + rc= 1; + } + else + { + rc= strcmp(ndn1,ndn2); } } } @@ -2176,22 +2353,25 @@ slapi_sdn_compare( const Slapi_DN *sdn1, const Slapi_DN *sdn2 ) }
int -slapi_sdn_isempty( const Slapi_DN *sdn) +slapi_sdn_isempty(const Slapi_DN *sdn) { - const char *dn= slapi_sdn_get_dn(sdn); + const char *dn = NULL; + if (sdn) { + dn = slapi_sdn_get_dn(sdn); + } return (dn==NULL || dn[0]=='\0'); }
int slapi_sdn_issuffix(const Slapi_DN *sdn, const Slapi_DN *suffixsdn) { - int rc; - const char *dn= slapi_sdn_get_ndn(sdn); + int rc; + const char *dn= slapi_sdn_get_ndn(sdn); const char *suffixdn= slapi_sdn_get_ndn(suffixsdn); if(dn!=NULL && suffixdn!=NULL) { - int dnlen = slapi_sdn_get_ndn_len(sdn); - int suffixlen= slapi_sdn_get_ndn_len(suffixsdn); + int dnlen = slapi_sdn_get_ndn_len(sdn); + int suffixlen= slapi_sdn_get_ndn_len(suffixsdn); if (dnlen<suffixlen) { rc= 0; @@ -2203,9 +2383,8 @@ slapi_sdn_issuffix(const Slapi_DN *sdn, const Slapi_DN *suffixsdn) return ( 1 ); }
- rc= ( (strcasecmp(suffixdn, dn+dnlen-suffixlen)==0) - && ( (dnlen == suffixlen) - || DNSEPARATOR(dn[dnlen-suffixlen-1])) ); + rc = (((dnlen == suffixlen) || DNSEPARATOR(dn[dnlen-suffixlen-1])) + && (strcasecmp(suffixdn, dn+dnlen-suffixlen)==0)); } } else @@ -2219,11 +2398,11 @@ slapi_sdn_issuffix(const Slapi_DN *sdn, const Slapi_DN *suffixsdn) int slapi_sdn_get_ndn_len(const Slapi_DN *sdn) { - int r= 0; - (void)slapi_sdn_get_ndn(sdn); /* does the normalization if needed */ - if(sdn->ndn!=NULL) + int r = 0; + (void)slapi_sdn_get_dn(sdn); /* does the normalization if needed */ + if(sdn->dn || sdn->ndn) { - r= sdn->ndn_len; + r = sdn->ndn_len; } return r; } @@ -2296,7 +2475,7 @@ slapi_sdn_scope_test( const Slapi_DN *dn, const Slapi_DN *base, int scope ) * build the new dn of an entry for moddn operations */ char * -slapi_moddn_get_newdn(Slapi_DN *dn_olddn, char *newrdn, char *newsuperiordn) +slapi_moddn_get_newdn(Slapi_DN *dn_olddn, const char *newrdn, const char *newsuperiordn) { char *newdn; diff --git a/ldap/servers/slapd/dse.c b/ldap/servers/slapd/dse.c index e3bfb18..727e999 100644 --- a/ldap/servers/slapd/dse.c +++ b/ldap/servers/slapd/dse.c @@ -1426,18 +1426,17 @@ dse_delete_entry(struct dse* pdse, Slapi_PBlock *pb, const Slapi_Entry *e) int dse_bind( Slapi_PBlock *pb ) /* JCM There should only be one exit point from this function! */ { - char *dn; /* The bind DN */ int method; /* The bind method */ struct berval *cred; /* The bind credentials */ Slapi_Value **bvals; struct dse* pdse; Slapi_Attr *attr; - Slapi_DN sdn; + Slapi_DN *sdn = NULL; Slapi_Entry *ec= NULL;
/*Get the parameters*/ if (slapi_pblock_get( pb, SLAPI_PLUGIN_PRIVATE, &pdse ) < 0 || - slapi_pblock_get( pb, SLAPI_BIND_TARGET, &dn ) < 0 || + slapi_pblock_get( pb, SLAPI_BIND_TARGET_SDN, &sdn ) < 0 || slapi_pblock_get( pb, SLAPI_BIND_METHOD, &method ) < 0 || slapi_pblock_get( pb, SLAPI_BIND_CREDENTIALS, &cred ) < 0){ slapi_send_ldap_result( pb, LDAP_OPERATIONS_ERROR, NULL, NULL, 0, NULL ); @@ -1456,13 +1455,10 @@ dse_bind( Slapi_PBlock *pb ) /* JCM There should only be one exit point from thi return( SLAPI_BIND_FAIL ); }
- /* Find the entry that the person is attempting to bind as */ - slapi_sdn_init_dn_byref(&sdn,dn); - ec = dse_get_entry_copy(pdse,&sdn,DSE_USE_LOCK); + ec = dse_get_entry_copy(pdse, sdn, DSE_USE_LOCK); if ( ec == NULL ) { slapi_send_ldap_result( pb, LDAP_NO_SUCH_OBJECT, NULL, NULL, 0, NULL ); - slapi_sdn_done(&sdn); return( SLAPI_BIND_FAIL ); }
@@ -1475,7 +1471,6 @@ dse_bind( Slapi_PBlock *pb ) /* JCM There should only be one exit point from thi { slapi_send_ldap_result( pb, LDAP_INAPPROPRIATE_AUTH, NULL, NULL, 0, NULL ); slapi_entry_free(ec); - slapi_sdn_done(&sdn); return SLAPI_BIND_FAIL; } bvals= attr_get_present_values( attr ); @@ -1485,7 +1480,6 @@ dse_bind( Slapi_PBlock *pb ) /* JCM There should only be one exit point from thi { slapi_send_ldap_result( pb, LDAP_INVALID_CREDENTIALS, NULL, NULL, 0, NULL ); slapi_entry_free(ec); - slapi_sdn_done(&sdn); value_done(&cv); return SLAPI_BIND_FAIL; } @@ -1496,11 +1490,9 @@ dse_bind( Slapi_PBlock *pb ) /* JCM There should only be one exit point from thi default: slapi_send_ldap_result( pb, LDAP_STRONG_AUTH_NOT_SUPPORTED, NULL, "auth method not supported", 0, NULL ); slapi_entry_free(ec); - slapi_sdn_done(&sdn); return SLAPI_BIND_FAIL; } slapi_entry_free(ec); - slapi_sdn_done(&sdn); /* success: front end will send result */ return SLAPI_BIND_SUCCESS; } @@ -1647,7 +1639,6 @@ do_dse_search(struct dse* pdse, Slapi_PBlock *pb, int scope, const Slapi_DN *bas int dse_search(Slapi_PBlock *pb) /* JCM There should only be one exit point from this function! */ { - char *base; /*Base of the search*/ int scope; /*Scope of the search*/ Slapi_Filter *filter; /*The filter*/ char **attrs; /*Attributes*/ @@ -1657,7 +1648,7 @@ dse_search(Slapi_PBlock *pb) /* JCM There should only be one exit point from thi int returncode= LDAP_SUCCESS; int isrootdse= 0; char returntext[SLAPI_DSE_RETURNTEXT_SIZE]= ""; - Slapi_DN basesdn; + Slapi_DN *basesdn = NULL; int estimate = 0; /* estimated search result set size */
/* @@ -1666,7 +1657,7 @@ dse_search(Slapi_PBlock *pb) /* JCM There should only be one exit point from thi * more or less directly from the client. */ if (slapi_pblock_get( pb, SLAPI_PLUGIN_PRIVATE, &pdse ) < 0 || - slapi_pblock_get( pb, SLAPI_SEARCH_TARGET, &base ) < 0 || + slapi_pblock_get( pb, SLAPI_SEARCH_TARGET_SDN, &basesdn ) < 0 || slapi_pblock_get( pb, SLAPI_SEARCH_SCOPE, &scope ) < 0 || slapi_pblock_get( pb, SLAPI_SEARCH_FILTER, &filter ) < 0 || slapi_pblock_get( pb, SLAPI_SEARCH_ATTRS, &attrs ) < 0 || @@ -1675,27 +1666,23 @@ dse_search(Slapi_PBlock *pb) /* JCM There should only be one exit point from thi slapi_send_ldap_result( pb, LDAP_OPERATIONS_ERROR, NULL, NULL, 0, NULL ); return(-1); } - - slapi_sdn_init_dn_byref(&basesdn,base); - /* * Sadly the root dse is still a special case. We must not allow * acl checks on it, or allow onelevel or subtree searches on it. */ - isrootdse= slapi_sdn_isempty(&basesdn); + isrootdse= slapi_sdn_isempty(basesdn);
switch(scope) { case LDAP_SCOPE_BASE: { Slapi_Entry *baseentry= NULL; - baseentry = dse_get_entry_copy(pdse,&basesdn,DSE_USE_LOCK); + baseentry = dse_get_entry_copy(pdse, basesdn, DSE_USE_LOCK); if ( baseentry == NULL ) { slapi_send_ldap_result( pb, LDAP_NO_SUCH_OBJECT, NULL, NULL, 0, NULL ); slapi_log_error(SLAPI_LOG_PLUGIN,"dse_search", "node %s was not found\n", - slapi_sdn_get_dn(&basesdn)); - slapi_sdn_done(&basesdn); + slapi_sdn_get_dn(basesdn)); return -1; } /* @@ -1726,14 +1713,13 @@ dse_search(Slapi_PBlock *pb) /* JCM There should only be one exit point from thi case LDAP_SCOPE_SUBTREE: if(!isrootdse) { - estimate = do_dse_search(pdse, pb, scope, &basesdn, filter, attrs, attrsonly); + estimate = do_dse_search(pdse, pb, scope, basesdn, filter, attrs, attrsonly); } break; } slapi_pblock_set (pb, SLAPI_SEARCH_RESULT_SET_SIZE_ESTIMATE, &estimate);
/* Search is done, send LDAP_SUCCESS */ - slapi_sdn_done(&basesdn); return 0; }
@@ -1756,19 +1742,19 @@ dse_modify(Slapi_PBlock *pb) /* JCM There should only be one exit point from thi { int err; /*House keeping stuff*/ LDAPMod **mods; /*Used to apply the modifications*/ - char *dn; /*Storage for the dn*/ char *errbuf = NULL; /* To get error back */ struct dse* pdse; Slapi_Entry *ec= NULL; Slapi_Entry *ecc= NULL; int returncode= LDAP_SUCCESS; char returntext[SLAPI_DSE_RETURNTEXT_SIZE]= ""; - Slapi_DN sdn; + Slapi_DN *sdn = NULL; int dont_write_file = 0; /* default */
PR_ASSERT(pb); if (slapi_pblock_get( pb, SLAPI_PLUGIN_PRIVATE, &pdse ) < 0 || - slapi_pblock_get( pb, SLAPI_MODIFY_TARGET, &dn ) < 0 || + /* slapi_pblock_get( pb, SLAPI_MODIFY_TARGET, &dn ) < 0 || */ + slapi_pblock_get( pb, SLAPI_MODIFY_TARGET_SDN, &sdn ) < 0 || slapi_pblock_get( pb, SLAPI_MODIFY_MODS, &mods ) < 0 || (NULL == pdse)) { slapi_send_ldap_result( pb, LDAP_OPERATIONS_ERROR, NULL, NULL, 0, NULL ); @@ -1780,14 +1766,11 @@ dse_modify(Slapi_PBlock *pb) /* JCM There should only be one exit point from thi return( -1 ); }
- slapi_sdn_init_dn_byref(&sdn,dn); - /* Find the entry we are about to modify. */ - ec = dse_get_entry_copy(pdse,&sdn,DSE_USE_LOCK); + ec = dse_get_entry_copy(pdse, sdn, DSE_USE_LOCK); if ( ec == NULL ) { slapi_send_ldap_result( pb, LDAP_NO_SUCH_OBJECT, NULL, NULL, 0, NULL ); - slapi_sdn_done(&sdn); return dse_modify_return( -1, ec, ecc ); }
@@ -1797,7 +1780,6 @@ dse_modify(Slapi_PBlock *pb) /* JCM There should only be one exit point from thi { slapi_send_ldap_result( pb, err, NULL, errbuf, 0, NULL ); if (errbuf) slapi_ch_free ((void**)&errbuf); - slapi_sdn_done(&sdn); return dse_modify_return( -1, ec, ecc ); }
@@ -1817,7 +1799,6 @@ dse_modify(Slapi_PBlock *pb) /* JCM There should only be one exit point from thi { /* Error occured in the callback -- return error code from callback */ slapi_send_ldap_result( pb, returncode, NULL, returntext, 0, NULL ); - slapi_sdn_done(&sdn); return dse_modify_return( -1, ec, ecc ); }
@@ -1825,7 +1806,6 @@ dse_modify(Slapi_PBlock *pb) /* JCM There should only be one exit point from thi { /* Callback says don't apply the changes -- return Success */ slapi_send_ldap_result( pb, LDAP_SUCCESS, NULL, NULL, 0, NULL ); - slapi_sdn_done(&sdn); return dse_modify_return( 0, ec, ecc ); }
@@ -1861,7 +1841,6 @@ dse_modify(Slapi_PBlock *pb) /* JCM There should only be one exit point from thi { /* entry_apply_mods() failed above, so return an error now */ slapi_send_ldap_result( pb, err, NULL, NULL, 0, NULL ); - slapi_sdn_done(&sdn); return dse_modify_return( -1, ec, ecc ); } break; @@ -1875,7 +1854,6 @@ dse_modify(Slapi_PBlock *pb) /* JCM There should only be one exit point from thi
slapi_pblock_get(pb, SLAPI_PB_RESULT_TEXT, &errtext); slapi_send_ldap_result( pb, LDAP_OBJECT_CLASS_VIOLATION, NULL, errtext, 0, NULL ); - slapi_sdn_done(&sdn); return dse_modify_return( -1, ec, ecc ); }
@@ -1886,7 +1864,6 @@ dse_modify(Slapi_PBlock *pb) /* JCM There should only be one exit point from thi
slapi_pblock_get(pb, SLAPI_PB_RESULT_TEXT, &errtext); slapi_send_ldap_result( pb, LDAP_INVALID_SYNTAX, NULL, errtext, 0, NULL ); - slapi_sdn_done(&sdn); return dse_modify_return( -1, ec, ecc ); }
@@ -1895,7 +1872,6 @@ dse_modify(Slapi_PBlock *pb) /* JCM There should only be one exit point from thi if (dse_replace_entry( pdse, ecc, !dont_write_file, DSE_USE_LOCK )!=0 ) { slapi_send_ldap_result( pb, LDAP_OPERATIONS_ERROR, NULL, NULL, 0, NULL ); - slapi_sdn_done(&sdn); return dse_modify_return( -1, ec, ecc ); } slapi_pblock_set( pb, SLAPI_ENTRY_POST_OP, slapi_entry_dup(ecc) ); /* JCM - When does this get free'd? */ @@ -1904,7 +1880,6 @@ dse_modify(Slapi_PBlock *pb) /* JCM There should only be one exit point from thi
slapi_send_ldap_result( pb, returncode, NULL, returntext, 0, NULL );
- slapi_sdn_done(&sdn); return dse_modify_return(0, ec, ecc); }
@@ -1922,7 +1897,6 @@ dse_add_return( int rv, Slapi_Entry *e) int dse_add(Slapi_PBlock *pb) /* JCM There should only be one exit point from this function! */ { - char *dn = NULL; Slapi_Entry *e; /*The new entry to add*/ Slapi_Entry *e_copy = NULL; /* copy of added entry */ char *errbuf = NULL; @@ -1932,14 +1906,14 @@ dse_add(Slapi_PBlock *pb) /* JCM There should only be one exit point from this f struct dse* pdse; int returncode= LDAP_SUCCESS; char returntext[SLAPI_DSE_RETURNTEXT_SIZE]= ""; - Slapi_DN sdn; + Slapi_DN *sdn = NULL; Slapi_DN parent;
/* * Get the database, the dn and the entry to add */ if (slapi_pblock_get( pb, SLAPI_PLUGIN_PRIVATE, &pdse ) < 0 || - slapi_pblock_get( pb, SLAPI_ADD_TARGET, &dn ) < 0 || + slapi_pblock_get( pb, SLAPI_ADD_TARGET_SDN, &sdn ) < 0 || slapi_pblock_get( pb, SLAPI_ADD_ENTRY, &e ) < 0 || (NULL == pdse)) { slapi_send_ldap_result( pb, LDAP_OPERATIONS_ERROR, NULL, NULL, 0, NULL ); @@ -1951,8 +1925,6 @@ dse_add(Slapi_PBlock *pb) /* JCM There should only be one exit point from this f return( error ); }
- slapi_sdn_init_dn_byref(&sdn,dn); - /* * Check to make sure the entry passes the schema check */ @@ -1963,7 +1935,6 @@ dse_add(Slapi_PBlock *pb) /* JCM There should only be one exit point from this f "dse_add: entry failed schema check\n", 0, 0, 0 ); slapi_pblock_get(pb, SLAPI_PB_RESULT_TEXT, &errtext); slapi_send_ldap_result( pb, LDAP_OBJECT_CLASS_VIOLATION, NULL, errtext, 0, NULL ); - slapi_sdn_done(&sdn); return error; }
@@ -1975,7 +1946,6 @@ dse_add(Slapi_PBlock *pb) /* JCM There should only be one exit point from this f "dse_add: entry failed syntax check\n", 0, 0, 0 ); slapi_pblock_get(pb, SLAPI_PB_RESULT_TEXT, &errtext); slapi_send_ldap_result( pb, LDAP_INVALID_SYNTAX, NULL, errtext, 0, NULL ); - slapi_sdn_done(&sdn); return error; }
@@ -1983,7 +1953,7 @@ dse_add(Slapi_PBlock *pb) /* JCM There should only be one exit point from this f * Attempt to find this dn. */ { - Slapi_Entry *existingentry= dse_get_entry_copy( pdse, &sdn, DSE_USE_LOCK ); + Slapi_Entry *existingentry= dse_get_entry_copy( pdse, sdn, DSE_USE_LOCK ); if(existingentry!=NULL) { /* @@ -1991,7 +1961,6 @@ dse_add(Slapi_PBlock *pb) /* JCM There should only be one exit point from this f * whose dn matches dn, so tell the user and return */ slapi_send_ldap_result( pb, LDAP_ALREADY_EXISTS, NULL, NULL, 0, NULL ); - slapi_sdn_done(&sdn); slapi_entry_free(existingentry); return dse_add_return(error, NULL); } @@ -2003,7 +1972,7 @@ dse_add(Slapi_PBlock *pb) /* JCM There should only be one exit point from this f * add the entry. */ slapi_sdn_init(&parent); - slapi_sdn_get_parent(&sdn,&parent); + slapi_sdn_get_parent(sdn, &parent); if ( !slapi_sdn_isempty(&parent) ) { Slapi_Entry *parententry= NULL; @@ -2012,7 +1981,6 @@ dse_add(Slapi_PBlock *pb) /* JCM There should only be one exit point from this f { slapi_send_ldap_result( pb, LDAP_NO_SUCH_OBJECT, NULL, NULL, 0, NULL ); LDAPDebug( SLAPI_DSE_TRACELEVEL, "dse_add: parent does not exist\n", 0, 0, 0 ); - slapi_sdn_done(&sdn); slapi_sdn_done(&parent); return dse_add_return(error, NULL); } @@ -2023,7 +1991,6 @@ dse_add(Slapi_PBlock *pb) /* JCM There should only be one exit point from this f LDAPDebug( SLAPI_DSE_TRACELEVEL, "dse_add: no access to parent\n", 0, 0, 0 ); slapi_send_ldap_result( pb, rc, NULL, NULL, 0, NULL ); slapi_ch_free((void**)&errbuf); - slapi_sdn_done(&sdn); slapi_sdn_done(&parent); return dse_add_return(rc, NULL); } @@ -2037,7 +2004,6 @@ dse_add(Slapi_PBlock *pb) /* JCM There should only be one exit point from this f { LDAPDebug( SLAPI_DSE_TRACELEVEL, "dse_add: no parent and not root\n", 0, 0, 0 ); slapi_send_ldap_result( pb, LDAP_INSUFFICIENT_ACCESS, NULL, NULL, 0, NULL ); - slapi_sdn_done(&sdn); slapi_sdn_done(&parent); return dse_add_return(error, NULL); } @@ -2060,7 +2026,6 @@ dse_add(Slapi_PBlock *pb) /* JCM There should only be one exit point from this f NULL, &returncode, returntext)!=SLAPI_DSE_CALLBACK_OK) { slapi_send_ldap_result( pb, returncode, NULL, returntext, 0, NULL ); - slapi_sdn_done(&sdn); return dse_add_return(error, NULL); }
@@ -2069,7 +2034,6 @@ dse_add(Slapi_PBlock *pb) /* JCM There should only be one exit point from this f if ( dse_add_entry_pb(pdse, e_copy, pb) != 0) { slapi_send_ldap_result( pb, LDAP_OPERATIONS_ERROR, NULL, NULL, 0, NULL ); - slapi_sdn_done(&sdn); return dse_add_return(error, NULL); } /* The postop must be called after the write lock is released. */ @@ -2083,9 +2047,6 @@ dse_add(Slapi_PBlock *pb) /* JCM There should only be one exit point from this f /* entry has been freed, so make sure no one tries to use it later */ slapi_pblock_set(pb, SLAPI_ADD_ENTRY, NULL);
- /* Free the dn, and return */ - slapi_sdn_done(&sdn); - return dse_add_return(rc, e); }
@@ -2104,40 +2065,37 @@ dse_delete_return( int rv, Slapi_Entry *ec) int dse_delete(Slapi_PBlock *pb) /* JCM There should only be one exit point from this function! */ { - char *dn = NULL; int rc= -1; - int dont_write_file = 0; /* default */ + int dont_write_file = 0; /* default */ struct dse* pdse = NULL; int returncode= LDAP_SUCCESS; char returntext[SLAPI_DSE_RETURNTEXT_SIZE]= ""; char *entry_str = "entry"; char *errbuf = NULL; - char *attrs[2] = { NULL, NULL }; - Slapi_DN sdn; - Slapi_Entry *ec = NULL; /* copy of entry to delete */ + char *attrs[2] = { NULL, NULL }; + Slapi_DN *sdn = NULL; + Slapi_Entry *ec = NULL; /* copy of entry to delete */
/* * Get the database and the dn */ if (slapi_pblock_get( pb, SLAPI_PLUGIN_PRIVATE, &pdse ) < 0 || - slapi_pblock_get( pb, SLAPI_DELETE_TARGET, &dn ) < 0 || (pdse == NULL)) + slapi_pblock_get( pb, SLAPI_DELETE_TARGET_SDN, &sdn ) < 0 || + (pdse == NULL)) { slapi_send_ldap_result( pb, LDAP_OPERATIONS_ERROR, NULL, NULL, 0, NULL ); return rc; }
- slapi_pblock_get(pb, SLAPI_DSE_DONT_WRITE_WHEN_ADDING, &dont_write_file); - if ( !dont_write_file && dse_check_for_readonly_error(pb,pdse)) { + slapi_pblock_get(pb, SLAPI_DSE_DONT_WRITE_WHEN_ADDING, &dont_write_file); + if ( !dont_write_file && dse_check_for_readonly_error(pb,pdse)) { return( rc ); }
- slapi_sdn_init_dn_byref(&sdn,dn); - - ec= dse_get_entry_copy( pdse, &sdn, DSE_USE_LOCK ); + ec= dse_get_entry_copy( pdse, sdn, DSE_USE_LOCK ); if (ec == NULL) { slapi_send_ldap_result( pb, LDAP_NO_SUCH_OBJECT, NULL, NULL, 0, NULL ); - slapi_sdn_done(&sdn); return dse_delete_return( rc, ec ); }
@@ -2147,7 +2105,6 @@ dse_delete(Slapi_PBlock *pb) /* JCM There should only be one exit point from thi if(dse_numsubordinates(ec)>0) { slapi_send_ldap_result( pb, LDAP_NOT_ALLOWED_ON_NONLEAF, NULL, NULL, 0, NULL ); - slapi_sdn_done(&sdn); return dse_delete_return( rc, ec ); }
@@ -2161,7 +2118,6 @@ dse_delete(Slapi_PBlock *pb) /* JCM There should only be one exit point from thi { slapi_send_ldap_result( pb, returncode, NULL, NULL, 0, NULL ); slapi_ch_free ( (void**)&errbuf ); - slapi_sdn_done(&sdn); return dse_delete_return( rc, ec ); }
@@ -2175,7 +2131,6 @@ dse_delete(Slapi_PBlock *pb) /* JCM There should only be one exit point from thi else { slapi_send_ldap_result( pb, returncode, NULL, NULL, 0, NULL ); - slapi_sdn_done(&sdn); return dse_delete_return( rc, ec ); }
@@ -2183,7 +2138,6 @@ dse_delete(Slapi_PBlock *pb) /* JCM There should only be one exit point from thi
slapi_send_ldap_result( pb, returncode, NULL, returntext, 0, NULL ); slapi_pblock_set( pb, SLAPI_ENTRY_PRE_OP, slapi_entry_dup( ec )); - slapi_sdn_done(&sdn); return dse_delete_return(0, ec); }
diff --git a/ldap/servers/slapd/entry.c b/ldap/servers/slapd/entry.c index 8a91e39..03f2767 100644 --- a/ldap/servers/slapd/entry.c +++ b/ldap/servers/slapd/entry.c @@ -276,18 +276,22 @@ str2entry_fast( const char *rawdn, char *s, int flags, int read_stateinfo ) normdn = slapi_dn_normalize_original(slapi_ch_strdup(rawdn)); } else { - normdn = slapi_create_dn_string("%s", rawdn); - if (NULL == normdn) { - LDAPDebug1Arg(LDAP_DEBUG_TRACE, - "str2entry_fast: Invalid DN: %s\n", rawdn); - slapi_entry_free( e ); - if (freeval) slapi_ch_free_string(&value.bv_val); - e = NULL; - goto done; + if (flags & SLAPI_STR2ENTRY_DN_NORMALIZED) { + normdn = slapi_ch_strdup(rawdn); + } else { + normdn = slapi_create_dn_string("%s", rawdn); + if (NULL == normdn) { + LDAPDebug1Arg(LDAP_DEBUG_TRACE, + "str2entry_fast: Invalid DN: %s\n", rawdn); + slapi_entry_free( e ); + if (freeval) slapi_ch_free_string(&value.bv_val); + e = NULL; + goto done; + } } } /* normdn is consumed in e */ - slapi_entry_set_dn(e, normdn); + slapi_entry_set_normdn(e, normdn); } if ( NULL == slapi_entry_get_rdn_const( e )) { if (normdn) { @@ -298,14 +302,19 @@ str2entry_fast( const char *rawdn, char *s, int flags, int read_stateinfo ) normdn = slapi_dn_normalize_original(slapi_ch_strdup(rawdn)); } else { - normdn = slapi_create_dn_string("%s", rawdn); - if (NULL == normdn) { - LDAPDebug1Arg(LDAP_DEBUG_TRACE, - "str2entry_fast: Invalid DN: %s\n", rawdn); - slapi_entry_free( e ); - if (freeval) slapi_ch_free_string(&value.bv_val); - e = NULL; - goto done; + if (flags & SLAPI_STR2ENTRY_DN_NORMALIZED) { + normdn = slapi_ch_strdup(rawdn); + } else { + normdn = slapi_create_dn_string("%s", rawdn); + if (NULL == normdn) { + LDAPDebug1Arg(LDAP_DEBUG_TRACE, + "str2entry_fast: Invalid DN: %s\n", rawdn); + slapi_entry_free( e ); + if (freeval) + slapi_ch_free_string(&value.bv_val); + e = NULL; + goto done; + } } } /* normdn is just referred in slapi_entry_set_rdn. */ @@ -345,7 +354,7 @@ str2entry_fast( const char *rawdn, char *s, int flags, int read_stateinfo ) goto done; } /* normdn is consumed in e */ - slapi_entry_set_dn(e, normdn); + slapi_entry_set_normdn(e, normdn);
/* the memory below was not allocated by the slapi_ch_ functions */ if (freeval) slapi_ch_free_string(&value.bv_val); @@ -429,7 +438,6 @@ str2entry_fast( const char *rawdn, char *s, int flags, int read_stateinfo ) if (slapi_attr_is_dn_syntax_attr(*a)) { int rc = 0; char *dn_aval = NULL; - size_t dnlen = 0; if (strict) { /* check that the dn is formatted correctly */ rc = slapi_dn_syntax_check(NULL, value.bv_val, 1); @@ -447,23 +455,14 @@ str2entry_fast( const char *rawdn, char *s, int flags, int read_stateinfo ) dn_aval = slapi_dn_normalize_original(value.bv_val); slapi_value_set(svalue, dn_aval, strlen(dn_aval)); } else { - rc = slapi_dn_normalize_ext(value.bv_val, - value.bv_len, &dn_aval, &dnlen); - if (rc < 0) { - /* Give up normalizing the attribute value */ - LDAPDebug2Args(LDAP_DEBUG_TRACE, - "str2entry_fast: Invalid DN value: %s: %s\n", - type.bv_val, value.bv_val); - dn_aval = value.bv_val; - dnlen = value.bv_len; - } else if (rc == 0) { /* rc == 0; valuecharptr is passed in; - not null terminated */ - *(dn_aval + dnlen) = '\0'; - } - slapi_value_set(svalue, dn_aval, dnlen); - if (rc > 0) { /* if rc == 0, valuecharptr is passed in */ - slapi_ch_free_string(&dn_aval); - } + Slapi_DN *sdn = slapi_sdn_new_dn_byref(value.bv_val); + /* Note: slapi_sdn_get_dn returns normalized DN with + * case-intact. Thus, the length of dn_aval is + * slapi_sdn_get_ndn_len(sdn). */ + dn_aval = (char *)slapi_sdn_get_dn(sdn); + slapi_value_set(svalue, (void *)dn_aval, + slapi_sdn_get_ndn_len(sdn)); + slapi_sdn_free(&sdn); } } else { slapi_value_set_berval(svalue, &value); @@ -809,34 +808,42 @@ str2entry_dupcheck( const char *rawdn, char *s, int flags, int read_stateinfo )
if ( rawdn ) { if ( NULL == slapi_entry_get_dn_const(e) ) { - normdn = slapi_create_dn_string("%s", rawdn); - if (NULL == normdn) { - LDAPDebug1Arg(LDAP_DEBUG_TRACE, - "str2entry_dupcheck: Invalid DN: %s\n", rawdn); - slapi_entry_free( e ); - if (freeval) slapi_ch_free_string(&bvvalue.bv_val); - csn_free(&attributedeletioncsn); - csn_free(&maxcsn); - return NULL; - } - /* normdn is consumed in e */ - slapi_entry_set_dn(e, normdn); - } - if ( NULL == slapi_entry_get_rdn_const(e) ) { - if (normdn) { - /* normdn is just referred in slapi_entry_set_rdn. */ - slapi_entry_set_rdn(e, normdn); + if (flags & SLAPI_STR2ENTRY_DN_NORMALIZED) { + normdn = slapi_ch_strdup(rawdn); } else { normdn = slapi_create_dn_string("%s", rawdn); if (NULL == normdn) { LDAPDebug1Arg(LDAP_DEBUG_TRACE, - "str2entry_dupcheck: Invalid DN: %s\n", rawdn); + "str2entry_dupcheck: Invalid DN: %s\n", rawdn); slapi_entry_free( e ); if (freeval) slapi_ch_free_string(&bvvalue.bv_val); csn_free(&attributedeletioncsn); csn_free(&maxcsn); return NULL; } + } + /* normdn is consumed in e */ + slapi_entry_set_normdn(e, normdn); + } + if ( NULL == slapi_entry_get_rdn_const(e) ) { + if (normdn) { + /* normdn is just referred in slapi_entry_set_rdn. */ + slapi_entry_set_rdn(e, normdn); + } else { + if (flags & SLAPI_STR2ENTRY_DN_NORMALIZED) { + normdn = slapi_ch_strdup(rawdn); + } else { + normdn = slapi_create_dn_string("%s", rawdn); + if (NULL == normdn) { + LDAPDebug1Arg(LDAP_DEBUG_TRACE, + "str2entry_dupcheck: Invalid DN: %s\n", rawdn); + slapi_entry_free( e ); + if (freeval) slapi_ch_free_string(&bvvalue.bv_val); + csn_free(&attributedeletioncsn); + csn_free(&maxcsn); + return NULL; + } + } /* normdn is just referred in slapi_entry_set_rdn. */ slapi_entry_set_rdn(e, normdn); slapi_ch_free_string(&normdn); @@ -866,7 +873,7 @@ str2entry_dupcheck( const char *rawdn, char *s, int flags, int read_stateinfo ) goto free_and_return; } /* normdn is consumed in e */ - slapi_entry_set_dn(e, normdn); + slapi_entry_set_normdn(e, normdn); /* the memory below was not allocated by the slapi_ch_ functions */ if (freeval) slapi_ch_free_string(&bvvalue.bv_val); continue; @@ -1019,8 +1026,8 @@ str2entry_dupcheck( const char *rawdn, char *s, int flags, int read_stateinfo ) sa = prev_attr; /* For readability */ value= value_new(NULL, CSN_TYPE_NONE, NULL); if (slapi_attr_is_dn_syntax_attr(&(sa->sa_attr))) { - char *dn_aval = NULL; - size_t dnlen = 0; + Slapi_DN *sdn = NULL; + const char *dn_aval = NULL; if (strict) { /* check that the dn is formatted correctly */ rc = slapi_dn_syntax_check(NULL, valuecharptr, 1); @@ -1033,22 +1040,13 @@ str2entry_dupcheck( const char *rawdn, char *s, int flags, int read_stateinfo ) goto free_and_return; } } - rc = slapi_dn_normalize_ext(bvvalue.bv_val, bvvalue.bv_len, &dn_aval, &dnlen); - if (rc < 0) { - /* Give up normalizing the attribute value */ - LDAPDebug2Args(LDAP_DEBUG_TRACE, - "str2entry_dupcheck: Invalid DN value: %s: %s\n", - type, valuecharptr); - dn_aval = valuecharptr; - dnlen = bvvalue.bv_len; - } - slapi_value_set(value, dn_aval, dnlen); - if (rc > 0) { /* if rc == 0, valuecharptr is passed in */ - slapi_ch_free_string(&dn_aval); - } else if (rc == 0) { /* rc == 0; valuecharptr is passed in; - not null terminated */ - *(dn_aval + dnlen) = '\0'; - } + sdn = slapi_sdn_new_dn_byref(bvvalue.bv_val); + /* Note: slapi_sdn_get_dn returns the normalized DN + * with case-intact. Thus, the length of dn_aval is + * slapi_sdn_get_ndn_len(sdn). */ + dn_aval = slapi_sdn_get_dn(sdn); + slapi_value_set(value, (void *)dn_aval, slapi_sdn_get_ndn_len(sdn)); + slapi_sdn_free(&sdn); } else { slapi_value_set_berval(value, &bvvalue); } @@ -1381,19 +1379,19 @@ slapi_str2entry( char *s, int flags ) * NOTE: the first arg "dn" should have been normalized before passing. */ Slapi_Entry * -slapi_str2entry_ext( const char *dn, char *s, int flags ) +slapi_str2entry_ext( const char *normdn, char *s, int flags ) { Slapi_Entry *e; int read_stateinfo= ~( flags & SLAPI_STR2ENTRY_IGNORE_STATE );
- if (NULL == dn) + if (NULL == normdn) { return slapi_str2entry( s, flags ); }
LDAPDebug( LDAP_DEBUG_ARGS, "slapi_str2entry_ext: flags=0x%x, dn="%s", entry="%.50s..."\n", - flags, dn, s ); + flags, normdn, s );
/* @@ -1404,11 +1402,13 @@ slapi_str2entry_ext( const char *dn, char *s, int flags ) if ( 0 != ( flags & SLAPI_STR2ENTRY_NOT_WELL_FORMED_LDIF ) || 0 != ( flags & ~SLAPI_STRENTRY_FLAGS_HANDLED_BY_STR2ENTRY_FAST )) { - e= str2entry_dupcheck( dn, s, flags, read_stateinfo ); + e = str2entry_dupcheck( normdn, s, + flags|SLAPI_STR2ENTRY_DN_NORMALIZED, read_stateinfo ); } else { - e= str2entry_fast( dn, s, flags, read_stateinfo ); + e = str2entry_fast( normdn, s, + flags|SLAPI_STR2ENTRY_DN_NORMALIZED, read_stateinfo ); } if (!e) return e; /* e == NULL */ @@ -1941,15 +1941,30 @@ void slapi_entry_init(Slapi_Entry *e, char *dn, Slapi_Attr *a) { slapi_sdn_set_dn_passin(slapi_entry_get_sdn(e), dn); - e->e_uniqueid= NULL; + e->e_uniqueid= NULL; e->e_attrs= a; e->e_dncsnset= NULL; e->e_maxcsn= NULL; - e->e_deleted_attrs= NULL; - e->e_virtual_attrs= NULL; - e->e_virtual_watermark= 0; - e->e_virtual_lock= slapi_new_rwlock(); - e->e_flags= 0; + e->e_deleted_attrs= NULL; + e->e_virtual_attrs= NULL; + e->e_virtual_watermark= 0; + e->e_virtual_lock= slapi_new_rwlock(); + e->e_flags= 0; +} + +void +slapi_entry_init_ext(Slapi_Entry *e, Slapi_DN *sdn, Slapi_Attr *a) +{ + slapi_sdn_copy(sdn, slapi_entry_get_sdn(e)); + e->e_uniqueid= NULL; + e->e_attrs= a; + e->e_dncsnset= NULL; + e->e_maxcsn= NULL; + e->e_deleted_attrs= NULL; + e->e_virtual_attrs= NULL; + e->e_virtual_watermark= 0; + e->e_virtual_lock= slapi_new_rwlock(); + e->e_flags= 0; }
void @@ -2004,10 +2019,10 @@ static size_t slapi_dn_size(Slapi_DN *sdn) if (sdn == NULL) return 0;
if (slapi_sdn_get_dn(sdn)) { - size += strlen(slapi_sdn_get_dn(sdn)) + 1; + size += slapi_sdn_get_ndn_len(sdn) + 1; } if (slapi_sdn_get_ndn(sdn)) { - size += strlen(slapi_sdn_get_ndn(sdn)) + 1; + size += slapi_sdn_get_ndn_len(sdn) + 1; }
return size; @@ -2182,6 +2197,12 @@ slapi_entry_set_dn( Slapi_Entry *e, char *dn ) slapi_sdn_set_dn_passin(slapi_entry_get_sdn(e),dn); }
+void +slapi_entry_set_normdn( Slapi_Entry *e, char *dn ) +{ + slapi_sdn_set_normdn_passin(slapi_entry_get_sdn(e), dn); +} + /* * WARNING - The DN is copied. * The DN could be dn or RDN. @@ -3166,18 +3187,18 @@ slapi_entry_rename(Slapi_Entry *e, const char *newrdn, int deleteoldrdn, const c /* Build new DN. If newsuperior is set, just use "newrdn,newsuperior". If * newsuperior is not set, need to add newrdn to old superior. */ if (newsuperior) { - newdn = slapi_ch_smprintf("%s,%s", newrdn, newsuperior); + newdn = slapi_create_dn_string("%s,%s", newrdn, newsuperior); } else { char *oldsuperior = NULL;
oldsuperior = slapi_dn_parent(olddn); - newdn = slapi_ch_smprintf("%s,%s", newrdn, oldsuperior); + newdn = slapi_create_dn_string("%s,%s", newrdn, oldsuperior);
slapi_ch_free_string(&oldsuperior); }
/* Set the new DN in the entry. This hands off the memory used by newdn to the entry. */ - slapi_entry_set_dn(e, newdn); + slapi_entry_set_normdn(e, newdn);
/* Set the RDN in the entry. */ slapi_entry_set_rdn(e, newdn); @@ -3826,8 +3847,8 @@ slapi_entries_diff(Slapi_Entry **old_entries, Slapi_Entry **curr_entries, } if (0 == isfirst && force_update && testall) { - slapi_modify_internal_set_pb(&pb, - slapi_entry_get_dn_const(*oep), + slapi_modify_internal_set_pb_ext(&pb, + slapi_entry_get_sdn_const(*oep), slapi_mods_get_ldapmods_byref(smods), NULL, NULL, plg_id, 0);
diff --git a/ldap/servers/slapd/extendop.c b/ldap/servers/slapd/extendop.c index 17b2f7b..8f25b27 100644 --- a/ldap/servers/slapd/extendop.c +++ b/ldap/servers/slapd/extendop.c @@ -54,8 +54,7 @@ static void extop_handle_import_start(Slapi_PBlock *pb, char *extoid, struct berval *extval) { char *orig = NULL; - char *suffix = NULL; - size_t dnlen = 0; + const char *suffix = NULL; Slapi_DN *sdn = NULL; Slapi_Backend *be = NULL; struct berval bv; @@ -84,28 +83,16 @@ static void extop_handle_import_start(Slapi_PBlock *pb, char *extoid, return; } } - ret = slapi_dn_normalize_ext(orig, 0, &suffix, &dnlen); - if (ret < 0) { - LDAPDebug1Arg(LDAP_DEBUG_ANY, - "extop_handle_import_start: invalid suffix\n", orig); - send_ldap_result(pb, LDAP_INVALID_DN_SYNTAX, NULL, - "invalid suffix", 0, NULL); - return; - } else if (ret > 0) { - slapi_ch_free_string(&orig); - } else { /* ret == 0; orig is passed in; not null terminated */ - *(suffix + dnlen) = '\0'; - } - sdn = slapi_sdn_new_dn_byval(suffix); + sdn = slapi_sdn_new_dn_passin(orig); if (!sdn) { LDAPDebug(LDAP_DEBUG_ANY, "extop_handle_import_start: out of memory\n", 0, 0, 0); send_ldap_result(pb, LDAP_OPERATIONS_ERROR, NULL, NULL, 0, NULL); return; } + suffix = slapi_sdn_get_dn(sdn); /* be = slapi_be_select(sdn); */ be = slapi_mapping_tree_find_backend_for_sdn(sdn); - slapi_sdn_free(&sdn); if (be == NULL || be == defbackend_get_backend()) { /* might be instance name instead of suffix */ be = slapi_be_select_by_instance_name(suffix); @@ -191,7 +178,7 @@ static void extop_handle_import_start(Slapi_PBlock *pb, char *extoid, "Bulk import: begin import on '%s'.\n", suffix, 0, 0);
out: - slapi_ch_free((void **)&suffix); + slapi_sdn_free(&sdn); return; }
diff --git a/ldap/servers/slapd/fedse.c b/ldap/servers/slapd/fedse.c index 8a61e72..ab94628 100644 --- a/ldap/servers/slapd/fedse.c +++ b/ldap/servers/slapd/fedse.c @@ -1562,7 +1562,7 @@ internal_add_helper(Slapi_Entry *e, int dont_write_file) slapi_add_entry_internal_set_pb(&newpb, e, NULL, plugin_get_default_component_id(), plugin_actions); - slapi_pblock_set(&newpb, SLAPI_TARGET_DN, (void*)slapi_entry_get_dn_const(e)); + slapi_pblock_set(&newpb, SLAPI_TARGET_SDN, (void*)slapi_entry_get_sdn_const(e)); slapi_pblock_set(&newpb, SLAPI_DSE_DONT_WRITE_WHEN_ADDING, (void *)&dont_write_file); slapi_pblock_get(&newpb, SLAPI_OPERATION, &op); diff --git a/ldap/servers/slapd/libglobs.c b/ldap/servers/slapd/libglobs.c index 928d648..b9beafb 100644 --- a/ldap/servers/slapd/libglobs.c +++ b/ldap/servers/slapd/libglobs.c @@ -1489,8 +1489,9 @@ int config_set_anon_limits_dn( const char *attrname, char *value, char *errorbuf CFG_LOCK_WRITE(slapdFrontendConfig);
slapi_ch_free ( (void **) &(slapdFrontendConfig->anon_limits_dn) ); - slapdFrontendConfig->anon_limits_dn = slapi_ch_strdup ( value ); - CFG_UNLOCK_WRITE(slapdFrontendConfig); + slapdFrontendConfig->anon_limits_dn = + slapi_create_dn_string("%s", value); + CFG_UNLOCK_WRITE(slapdFrontendConfig); } return retVal; } diff --git a/ldap/servers/slapd/main.c b/ldap/servers/slapd/main.c index 059cf33..ffcdbab 100644 --- a/ldap/servers/slapd/main.c +++ b/ldap/servers/slapd/main.c @@ -1644,14 +1644,22 @@ process_command_line(int argc, char **argv, char *myname, break; case 's': /* which suffix to include in import/export */ { - char *s= slapi_dn_normalize ( slapi_ch_strdup(optarg_ext) ); - charray_add(&db2ldif_include,s); + int rc = charray_normdn_add(&db2ldif_include, optarg_ext, NULL); + if (rc < 0) { + fprintf(stderr, "Invalid dn: -s %s\n", optarg_ext); + usage(myname, *extraname); + exit(1); + } } break; case 'x': /* which suffix to exclude in import/export */ { - char *s= slapi_dn_normalize ( slapi_ch_strdup(optarg_ext) ); - charray_add(&db2ldif_exclude,s); + int rc = charray_normdn_add(&db2ldif_exclude, optarg_ext, NULL); + if (rc < 0) { + fprintf(stderr, "Invalid dn: -x %s\n", optarg_ext); + usage(myname, *extraname); + exit(1); + } } break; case 'r': /* db2ldif for replication */ diff --git a/ldap/servers/slapd/mapping_tree.c b/ldap/servers/slapd/mapping_tree.c index cc007df..64a00bf 100644 --- a/ldap/servers/slapd/mapping_tree.c +++ b/ldap/servers/slapd/mapping_tree.c @@ -245,7 +245,7 @@ Slapi_DN* slapi_mtn_get_dn(mapping_tree_node *node)
/* this will turn an array of url into a referral entry */ static Slapi_Entry * -referral2entry(char ** url_array, const char *target) +referral2entry(char ** url_array, Slapi_DN *target_sdn) { int i; struct berval bv0,bv1,*bvals[3]; @@ -255,7 +255,7 @@ referral2entry(char ** url_array, const char *target) return NULL;
anEntry = slapi_entry_alloc(); - slapi_entry_set_dn(anEntry,slapi_ch_strdup(target)); + slapi_entry_set_sdn(anEntry, target_sdn);
bvals[2]=NULL; bvals[1]=&bv1; @@ -309,7 +309,7 @@ mapping_tree_node_new(Slapi_DN *dn, Slapi_Backend **be, char **backend_names, in node->mtn_be_states = be_states; node->mtn_backend_names = backend_names; node->mtn_referral = referral; - node->mtn_referral_entry = referral2entry(referral, slapi_sdn_get_dn(dn)) ; + node->mtn_referral_entry = referral2entry(referral, dn) ; node->mtn_parent = parent; node->mtn_children = NULL; node->mtn_brother = NULL; @@ -386,8 +386,7 @@ get_parent_from_entry(Slapi_Entry * entry) *ptr = '\0'; } } - parent_sdn = - slapi_sdn_new_dn_passin(slapi_create_dn_string("%s", parent)); + parent_sdn = slapi_sdn_new_dn_passin(slapi_ch_smprintf("%s", parent)); slapi_ch_free_string(&origparent); }
@@ -433,7 +432,7 @@ get_subtree_from_entry(Slapi_Entry * entry) *ptr = '\0'; } } - subtree = slapi_sdn_new_dn_passin(slapi_create_dn_string("%s", cn)); + subtree = slapi_sdn_new_dn_passin(slapi_ch_smprintf("%s", cn)); slapi_ch_free_string(&origcn); }
@@ -1240,8 +1239,7 @@ int mapping_tree_entry_modify_callback(Slapi_PBlock *pb, Slapi_Entry* entryBefor mtn_free_referral_in_node(node); referral = mtn_get_referral_from_entry(entryAfter); node->mtn_referral = referral; - node->mtn_referral_entry = - referral2entry(referral, slapi_sdn_get_dn(subtree)); + node->mtn_referral_entry = referral2entry(referral, subtree); } else if (SLAPI_IS_MOD_DELETE(mods[i]->mod_op)) { /* it is not OK to delete the referrals if they are still @@ -2128,8 +2126,7 @@ int slapi_mapping_tree_select_all(Slapi_PBlock *pb, Slapi_Backend **be_list, Slapi_Backend * be; Slapi_Entry * referral; int scope = LDAP_SCOPE_BASE; - Slapi_DN sdn; - char *base; + Slapi_DN *sdn = NULL; int flag_partial_result = 0; int op_type;
@@ -2142,8 +2139,11 @@ int slapi_mapping_tree_select_all(Slapi_PBlock *pb, Slapi_Backend **be_list, }
/* get the operational parameters */ - slapi_pblock_get(pb, SLAPI_SEARCH_TARGET, &base); - slapi_sdn_init_dn_ndn_byref(&sdn, base); /* normalized in opshared.c */ + slapi_pblock_get(pb, SLAPI_SEARCH_TARGET_SDN, &sdn); + if (NULL == sdn) { + slapi_log_error(SLAPI_LOG_FATAL, NULL, "Error: Null target DN"); + return LDAP_OPERATIONS_ERROR; + } slapi_pblock_get(pb, SLAPI_OPERATION, &op); target_sdn = operation_get_target_spec (op); slapi_pblock_get(pb, SLAPI_OPERATION_TYPE, &op_type); @@ -2188,8 +2188,8 @@ int slapi_mapping_tree_select_all(Slapi_PBlock *pb, Slapi_Backend **be_list, /* flag we have problems at least on part of the tree */ flag_partial_result = 1; } - else if ( ( ((!slapi_sdn_issuffix(&sdn, slapi_mtn_get_dn(node)) - && !slapi_sdn_issuffix(slapi_mtn_get_dn(node), &sdn))) + else if ( ( ((!slapi_sdn_issuffix(sdn, slapi_mtn_get_dn(node)) + && !slapi_sdn_issuffix(slapi_mtn_get_dn(node), sdn))) || ((node_list == mapping_tree_root) && node->mtn_private && (scope != LDAP_SCOPE_BASE)) ) && (!be || strncmp(be->be_name, "default", 8))) @@ -2238,7 +2238,6 @@ int slapi_mapping_tree_select_all(Slapi_PBlock *pb, Slapi_Backend **be_list, &referral, errorbuf, scope); } mtn_unlock(); - slapi_sdn_done(&sdn); be_list[be_index] = NULL; referral_list[referral_index] = NULL;
@@ -2839,8 +2838,8 @@ slapi_get_mapping_tree_node_configdn (const Slapi_DN *root) return NULL;
/* This function converts the old DN style to the new one. */ - dn = slapi_create_dn_string("cn="%s",%s", - slapi_sdn_get_dn(root), MAPPING_TREE_BASE_DN); + dn = slapi_ch_smprintf("cn="%s",%s", + slapi_sdn_get_ndn(root), MAPPING_TREE_BASE_DN); if (NULL == dn) { LDAPDebug1Arg(LDAP_DEBUG_ANY, "slapi_get_mapping_tree_node_configdn: " @@ -2852,6 +2851,35 @@ slapi_get_mapping_tree_node_configdn (const Slapi_DN *root) return dn; }
+Slapi_DN * +slapi_get_mapping_tree_node_configsdn (const Slapi_DN *root) +{ + char *dn = NULL; + Slapi_DN *sdn = NULL; + + if(mapping_tree_freed){ + /* shutdown detected */ + return NULL; + } + if (root == NULL) + return NULL; + + /* This function converts the old DN style to the new one. */ + dn = slapi_ch_smprintf("cn="%s",%s", + slapi_sdn_get_dn(root), MAPPING_TREE_BASE_DN); + if (NULL == dn) { + LDAPDebug1Arg(LDAP_DEBUG_ANY, + "slapi_get_mapping_tree_node_configsdn: " + "failed to crate mapping tree dn for %s\n", + slapi_sdn_get_dn(root)); + return NULL; + } + + sdn = slapi_sdn_new_dn_passin(dn); + + return sdn; +} + /* * Description: this function returns root of the subtree to which the node applies * @@ -3122,13 +3150,13 @@ slapi_mtn_set_referral(const Slapi_DN *sdn, char ** referral) Slapi_PBlock pb; Slapi_Mods smods; int rc = LDAP_SUCCESS,i = 0, j = 0; - char * node_dn; + Slapi_DN* node_sdn; char **values = NULL; int do_modify = 0;
slapi_mods_init (&smods, 0); - node_dn = slapi_get_mapping_tree_node_configdn(sdn); - if(!node_dn){ + node_sdn = slapi_get_mapping_tree_node_configsdn(sdn); + if(!node_sdn){ /* shutdown has been detected */ return LDAP_OPERATIONS_ERROR; } @@ -3192,7 +3220,7 @@ slapi_mtn_set_referral(const Slapi_DN *sdn, char ** referral) if ( do_modify ) { pblock_init (&pb); - slapi_modify_internal_set_pb (&pb, node_dn, + slapi_modify_internal_set_pb_ext (&pb, node_sdn, slapi_mods_get_ldapmods_byref(&smods), NULL, NULL, (void *) plugin_get_default_component_id(), 0); slapi_modify_internal_pb (&pb); @@ -3202,7 +3230,7 @@ slapi_mtn_set_referral(const Slapi_DN *sdn, char ** referral) }
slapi_mods_done(&smods); - slapi_ch_free_string(&node_dn); + slapi_sdn_free(&node_sdn);
return rc; } @@ -3220,15 +3248,15 @@ slapi_mtn_set_state(const Slapi_DN *sdn, char *state) Slapi_PBlock pb; Slapi_Mods smods; int rc = LDAP_SUCCESS; - char * node_dn; + Slapi_DN *node_sdn; char * value;
if (NULL == state) { return LDAP_OPERATIONS_ERROR; }
- node_dn = slapi_get_mapping_tree_node_configdn(sdn); - if(!node_dn){ + node_sdn = slapi_get_mapping_tree_node_configsdn(sdn); + if(!node_sdn){ /* shutdown has been detected */ return LDAP_OPERATIONS_ERROR; } @@ -3246,7 +3274,7 @@ slapi_mtn_set_state(const Slapi_DN *sdn, char *state) slapi_mods_init (&smods, 1); slapi_mods_add(&smods, LDAP_MOD_REPLACE, "nsslapd-state", strlen(state), state); pblock_init (&pb); - slapi_modify_internal_set_pb (&pb, node_dn, + slapi_modify_internal_set_pb_ext (&pb, node_sdn, slapi_mods_get_ldapmods_byref(&smods), NULL, NULL, (void *) plugin_get_default_component_id(), 0); slapi_modify_internal_pb (&pb); @@ -3257,7 +3285,7 @@ slapi_mtn_set_state(const Slapi_DN *sdn, char *state) pblock_done(&pb); bail: slapi_ch_free_string(&value); - slapi_ch_free_string(&node_dn); + slapi_sdn_free(&node_sdn); return rc; }
diff --git a/ldap/servers/slapd/modify.c b/ldap/servers/slapd/modify.c index e240237..45e55b2 100644 --- a/ldap/servers/slapd/modify.c +++ b/ldap/servers/slapd/modify.c @@ -138,7 +138,7 @@ do_modify( Slapi_PBlock *pb ) int ignored_some_mods = 0; int has_password_mod = 0; /* number of password mods */ char *old_pw = NULL; /* remember the old password */ - char *dn = NULL; + char *rawdn = NULL;
LDAPDebug( LDAP_DEBUG_TRACE, "do_modify\n", 0, 0, 0 );
@@ -168,8 +168,6 @@ do_modify( Slapi_PBlock *pb ) */
{ - char *rawdn = NULL; - size_t dnlen = 0; int rc = 0; if ( ber_scanf( ber, "{a", &rawdn ) == LBER_ERROR ) { @@ -193,24 +191,12 @@ do_modify( Slapi_PBlock *pb ) return; } } - rc = slapi_dn_normalize_ext(rawdn, 0, &dn, &dnlen); - if (rc < 0) { - op_shared_log_error_access(pb, "MOD", rawdn?rawdn:"", "invalid dn"); - send_ldap_result(pb, LDAP_INVALID_DN_SYNTAX, - NULL, "invalid dn", 0, NULL); - slapi_ch_free((void **) &rawdn); - return; - } else if (rc > 0) { /* if rc == 0, rawdn is passed in */ - slapi_ch_free_string(&rawdn); - } else { /* rc == 0; rawdn is passed in; not null terminated */ - *(dn + dnlen) = '\0'; - } }
- LDAPDebug( LDAP_DEBUG_ARGS, "do_modify: dn (%s)\n", dn, 0, 0 ); + LDAPDebug( LDAP_DEBUG_ARGS, "do_modify: dn (%s)\n", rawdn, 0, 0 );
slapi_pblock_set( pb, SLAPI_REQUESTOR_ISROOT, &pb->pb_op->o_isroot); - slapi_pblock_set( pb, SLAPI_ORIGINAL_TARGET, dn ); + slapi_pblock_set( pb, SLAPI_ORIGINAL_TARGET, rawdn );
/* collect modifications & save for later */ slapi_mods_init(&smods, 0); @@ -227,7 +213,7 @@ do_modify( Slapi_PBlock *pb ) if ( ber_scanf( ber, "{i{a[V]}}", &mod_op, &type, &mod->mod_bvalues ) == LBER_ERROR ) { - op_shared_log_error_access (pb, "MOD", dn, "decoding error"); + op_shared_log_error_access (pb, "MOD", rawdn, "decoding error"); send_ldap_result( pb, LDAP_PROTOCOL_ERROR, NULL, "decoding error", 0, NULL ); ber_bvecfree(mod->mod_bvalues); @@ -240,7 +226,7 @@ do_modify( Slapi_PBlock *pb ) if ( !mod->mod_type || !*mod->mod_type ) { char ebuf[BUFSIZ]; PR_snprintf (ebuf, BUFSIZ, "invalid type '%s'", type); - op_shared_log_error_access (pb, "MOD", dn, ebuf); + op_shared_log_error_access (pb, "MOD", rawdn, ebuf); send_ldap_result( pb, LDAP_INVALID_SYNTAX, NULL, ebuf, 0, NULL ); slapi_ch_free((void **)&type); ber_bvecfree(mod->mod_bvalues); @@ -254,7 +240,7 @@ do_modify( Slapi_PBlock *pb ) mod->mod_op != LDAP_MOD_DELETE && mod->mod_op != LDAP_MOD_REPLACE ) { - op_shared_log_error_access (pb, "MOD", dn, "unrecognized modify operation"); + op_shared_log_error_access (pb, "MOD", rawdn, "unrecognized modify operation"); send_ldap_result( pb, LDAP_PROTOCOL_ERROR, NULL, "unrecognized modify operation", 0, NULL ); ber_bvecfree(mod->mod_bvalues); @@ -267,7 +253,7 @@ do_modify( Slapi_PBlock *pb ) && mod->mod_op != LDAP_MOD_DELETE && mod->mod_op != LDAP_MOD_REPLACE ) { - op_shared_log_error_access (pb, "MOD", dn, "no values given"); + op_shared_log_error_access (pb, "MOD", rawdn, "no values given"); send_ldap_result( pb, LDAP_PROTOCOL_ERROR, NULL, "no values given", 0, NULL ); ber_bvecfree(mod->mod_bvalues); @@ -317,7 +303,7 @@ do_modify( Slapi_PBlock *pb ) if ( ( len == 0 ) && ( 0 == smods.num_elements ) && !ignored_some_mods ) { /* ok - empty modify - allow empty modifies */ } else if ( len != -1 ) { - op_shared_log_error_access (pb, "MOD", dn, "decoding error"); + op_shared_log_error_access (pb, "MOD", rawdn, "decoding error"); send_ldap_result( pb, LDAP_PROTOCOL_ERROR, NULL, "decoding error", 0, NULL ); goto free_and_return; } @@ -326,7 +312,7 @@ do_modify( Slapi_PBlock *pb ) #else if ( tag != LBER_END_OF_SEQORSET ) { - op_shared_log_error_access (pb, "MOD", dn, "decoding error"); + op_shared_log_error_access (pb, "MOD", rawdn, "decoding error"); send_ldap_result( pb, LDAP_PROTOCOL_ERROR, NULL, "decoding error", 0, NULL ); goto free_and_return; } @@ -335,7 +321,7 @@ do_modify( Slapi_PBlock *pb ) /* decode the optional controls - put them in the pblock */ if ( (err = get_ldapmessage_controls( pb, ber, NULL )) != 0 ) { - op_shared_log_error_access (pb, "MOD", dn, "failed to decode LDAP controls"); + op_shared_log_error_access (pb, "MOD", rawdn, "failed to decode LDAP controls"); send_ldap_result( pb, err, NULL, NULL, 0, NULL ); goto free_and_return; } @@ -362,7 +348,7 @@ do_modify( Slapi_PBlock *pb ) pb->pb_conn->c_needpw && pw_change == 0 ) { (void)slapi_add_pwd_control ( pb, LDAP_CONTROL_PWEXPIRED, 0); - op_shared_log_error_access (pb, "MOD", dn, "need new password"); + op_shared_log_error_access (pb, "MOD", rawdn, "need new password"); send_ldap_result( pb, LDAP_UNWILLING_TO_PERFORM, NULL, NULL, 0, NULL ); goto free_and_return; } @@ -387,7 +373,7 @@ do_modify( Slapi_PBlock *pb ) ldap_mods_free (mods, 1 /* Free the Array and the Elements */);
free_and_return:; - slapi_ch_free ((void**)&dn); + slapi_ch_free ((void**)&rawdn); slapi_mods_done(&smods); }
@@ -452,8 +438,12 @@ int slapi_modify_internal_pb (Slapi_PBlock *pb) }
/* Initialize a pblock for a call to slapi_modify_internal_pb() */ -void slapi_modify_internal_set_pb (Slapi_PBlock *pb, const char *dn, LDAPMod **mods, LDAPControl **controls, - const char *uniqueid, Slapi_ComponentId *plugin_identity, int operation_flags) +void +slapi_modify_internal_set_pb (Slapi_PBlock *pb, const char *dn, + LDAPMod **mods, LDAPControl **controls, + const char *uniqueid, + Slapi_ComponentId *plugin_identity, + int operation_flags) { Operation *op; PR_ASSERT (pb != NULL); @@ -464,10 +454,40 @@ void slapi_modify_internal_set_pb (Slapi_PBlock *pb, const char *dn, LDAPMod **m return; }
- op= internal_operation_new(SLAPI_OPERATION_MODIFY,operation_flags); + op= internal_operation_new(SLAPI_OPERATION_MODIFY,operation_flags); slapi_pblock_set(pb, SLAPI_OPERATION, op); slapi_pblock_set(pb, SLAPI_ORIGINAL_TARGET, (void*)dn); - slapi_pblock_set(pb, SLAPI_MODIFY_MODS, mods); + slapi_pblock_set(pb, SLAPI_MODIFY_MODS, mods); + slapi_pblock_set(pb, SLAPI_CONTROLS_ARG, controls); + if (uniqueid) + { + slapi_pblock_set(pb, SLAPI_TARGET_UNIQUEID, (void*)uniqueid); + } + slapi_pblock_set(pb, SLAPI_PLUGIN_IDENTITY, plugin_identity); +} + +/* Initialize a pblock for a call to slapi_modify_internal_pb() */ +void +slapi_modify_internal_set_pb_ext(Slapi_PBlock *pb, const Slapi_DN *sdn, + LDAPMod **mods, LDAPControl **controls, + const char *uniqueid, + Slapi_ComponentId *plugin_identity, + int operation_flags) +{ + Operation *op; + PR_ASSERT (pb != NULL); + if (pb == NULL || sdn == NULL || mods == NULL) + { + slapi_log_error(SLAPI_LOG_FATAL, NULL, + "slapi_modify_internal_set_pb: NULL parameter\n"); + return; + } + + op= internal_operation_new(SLAPI_OPERATION_MODIFY,operation_flags); + slapi_pblock_set(pb, SLAPI_OPERATION, op); + slapi_pblock_set(pb, SLAPI_ORIGINAL_TARGET, (void *)slapi_sdn_get_dn(sdn)); + slapi_pblock_set(pb, SLAPI_TARGET_SDN, (void *)sdn); + slapi_pblock_set(pb, SLAPI_MODIFY_MODS, mods); slapi_pblock_set(pb, SLAPI_CONTROLS_ARG, controls); if (uniqueid) { @@ -583,8 +603,10 @@ static void op_shared_modify (Slapi_PBlock *pb, int pw_change, char *old_pw) Slapi_Entry *referral; Slapi_Entry *e = NULL; char ebuf[BUFSIZ]; - char *dn; - Slapi_DN sdn; + char *dn = NULL; + char *normdn = NULL; + Slapi_DN *sdn = NULL; + int passin_sdn = 0; LDAPMod **mods, *pw_mod, **tmpmods = NULL; Slapi_Mods smods; Slapi_Mods unhashed_pw_smod; @@ -601,6 +623,7 @@ static void op_shared_modify (Slapi_PBlock *pb, int pw_change, char *old_pw) char *errtext = NULL;
slapi_pblock_get (pb, SLAPI_ORIGINAL_TARGET, &dn); + slapi_pblock_get (pb, SLAPI_MODIFY_TARGET_SDN, &sdn); slapi_pblock_get (pb, SLAPI_MODIFY_MODS, &mods); slapi_pblock_get (pb, SLAPI_MODIFY_MODS, &tmpmods); slapi_pblock_get (pb, SLAPI_IS_REPLICATED_OPERATION, &repl_op); @@ -608,23 +631,27 @@ static void op_shared_modify (Slapi_PBlock *pb, int pw_change, char *old_pw) internal_op= operation_is_flag_set(operation, OP_FLAG_INTERNAL); slapi_pblock_get (pb, SLAPI_SKIP_MODIFIED_ATTRS, &skip_modified_attrs);
- if (dn == NULL) - { - slapi_sdn_init_dn_byref (&sdn, ""); + if (sdn) { + passin_sdn = 1; + } else { + sdn = slapi_sdn_new_dn_byval(dn); + slapi_pblock_set(pb, SLAPI_MODIFY_TARGET_SDN, (void*)sdn); } - else - { - slapi_sdn_init_dn_byref (&sdn, dn); + normdn = (char *)slapi_sdn_get_dn(sdn); + if (dn && (strlen(dn) > 0) && (NULL == normdn)) { + /* normalization failed */ + op_shared_log_error_access(pb, "MOD", dn, "invalid dn"); + send_ldap_result(pb, LDAP_INVALID_DN_SYNTAX, NULL, + "invalid dn", 0, NULL); + goto free_and_return; }
- slapi_pblock_set(pb, SLAPI_MODIFY_TARGET, (void*)slapi_sdn_get_ndn (&sdn)); - - slapi_mods_init_passin (&smods, mods); + slapi_mods_init_passin (&smods, mods);
slapi_mods_init(&unhashed_pw_smod, 0);
/* target spec is used to decide which plugins are applicable for the operation */ - operation_set_target_spec (pb->pb_op, &sdn); + operation_set_target_spec (pb->pb_op, sdn);
/* get the proxy auth dn if the proxy auth control is present */ proxy_err = proxyauth_get_dn(pb, &proxydn, &errtext); @@ -643,7 +670,7 @@ static void op_shared_modify (Slapi_PBlock *pb, int pw_change, char *old_pw) slapi_log_access(LDAP_DEBUG_STATS, "conn=%" NSPRIu64 " op=%d MOD dn="%s"%s\n", pb->pb_conn->c_connid, pb->pb_op->o_opid, - escape_string(slapi_sdn_get_dn(&sdn), ebuf), + escape_string(slapi_sdn_get_dn(sdn), ebuf), proxystr ? proxystr : ""); } else @@ -651,7 +678,7 @@ static void op_shared_modify (Slapi_PBlock *pb, int pw_change, char *old_pw) slapi_log_access(LDAP_DEBUG_ARGS, "conn=%s op=%d MOD dn="%s"%s\n", LOG_INTERNAL_OP_CON_ID, LOG_INTERNAL_OP_OP_ID, - escape_string(slapi_sdn_get_dn(&sdn), ebuf), + escape_string(slapi_sdn_get_dn(sdn), ebuf), proxystr ? proxystr : ""); }
@@ -702,8 +729,7 @@ static void op_shared_modify (Slapi_PBlock *pb, int pw_change, char *old_pw) * 2. If yes, then if the mods contain any passwdpolicy specific attributes. * 3. If yes, then it invokes corrosponding checking function. */ - if ( !repl_op && !internal_op && dn && - (e = get_entry(pb, slapi_dn_normalize(dn))) ) + if ( !repl_op && !internal_op && normdn && (e = get_entry(pb, normdn)) ) { Slapi_Value target; slapi_value_init(&target); @@ -785,7 +811,7 @@ static void op_shared_modify (Slapi_PBlock *pb, int pw_change, char *old_pw) valuearray_init_bervalarray(pw_mod->mod_bvalues, &va);
/* encode password */ - pw_encodevals_ext(pb, &sdn, va); + pw_encodevals_ext(pb, sdn, va);
/* remove current clear value of userpassword */ ber_bvecfree(pw_mod->mod_bvalues); @@ -937,13 +963,17 @@ free_and_return: if (be) slapi_be_Unlock(be); - slapi_sdn_done(&sdn);
slapi_mods_done(&unhashed_pw_smod); /* can finalize now */ if (unhashed_pw_attr) slapi_ch_free ((void**)&unhashed_pw_attr);
slapi_ch_free_string(&proxydn); + + slapi_pblock_get(pb, SLAPI_MODIFY_TARGET_SDN, &sdn); + if (!passin_sdn) { + slapi_sdn_free(&sdn); + } }
static void remove_mod (Slapi_Mods *smods, const char *type, Slapi_Mods *smod_unhashed) diff --git a/ldap/servers/slapd/modrdn.c b/ldap/servers/slapd/modrdn.c index 24e444c..a7bb1a6 100644 --- a/ldap/servers/slapd/modrdn.c +++ b/ldap/servers/slapd/modrdn.c @@ -73,17 +73,16 @@ do_modrdn( Slapi_PBlock *pb ) Slapi_Operation *operation; BerElement *ber; char *rawdn = NULL, *rawnewsuperior = NULL; - char *dn = NULL, *newsuperior = NULL; + const char *dn = NULL, *newsuperior = NULL; char *rawnewrdn = NULL; char *newrdn = NULL; int err = 0, deloldrdn = 0; ber_len_t len = 0; - size_t dnlen = 0; char *newdn = NULL; char *parent = NULL; - Slapi_DN sdn = {0}; - Slapi_DN snewdn = {0}; - Slapi_DN snewsuperior = {0}; + Slapi_DN sdn; + Slapi_DN snewdn; + Slapi_DN *snewsuperior = NULL;
LDAPDebug( LDAP_DEBUG_TRACE, "do_modrdn\n", 0, 0, 0 );
@@ -93,6 +92,9 @@ do_modrdn( Slapi_PBlock *pb ) slapi_pblock_get( pb, SLAPI_OPERATION, &operation); ber = operation->o_ber;
+ slapi_sdn_init(&sdn); + slapi_sdn_init(&snewdn); + /* * Parse the modrdn request. It looks like this: * @@ -169,34 +171,29 @@ do_modrdn( Slapi_PBlock *pb ) goto free_and_return; } } - err = slapi_dn_normalize_ext(rawdn, 0, &dn, &dnlen); - if (err < 0) { - op_shared_log_error_access(pb, "MODRDN", rawdn?rawdn:"", "invalid dn"); - send_ldap_result(pb, LDAP_INVALID_DN_SYNTAX, - NULL, "invalid dn", 0, NULL); - slapi_ch_free_string( &rawdn ); + slapi_sdn_init_dn_passin(&sdn, rawdn); + dn = slapi_sdn_get_dn(&sdn); + if (rawdn && (strlen(rawdn) > 0) && (NULL == dn)) { + /* normalization failed */ + op_shared_log_error_access(pb, "MODRDN", rawdn, "invalid dn"); + send_ldap_result(pb, LDAP_INVALID_DN_SYNTAX, NULL, + "invalid dn", 0, NULL); slapi_ch_free_string( &rawnewrdn ); slapi_ch_free_string( &rawnewsuperior ); goto free_and_return; - } else if (err > 0) { - slapi_ch_free((void **) &rawdn); - } else { /* err == 0; rawdn is passed in; not null terminated */ - *(dn + dnlen) = '\0'; } - err = slapi_dn_normalize_ext(rawnewrdn, 0, &newrdn, &dnlen); - if (err < 0) { - op_shared_log_error_access(pb, "MODRDN", rawnewrdn?rawnewrdn:"", - "invalid new rdn"); - send_ldap_result(pb, LDAP_INVALID_DN_SYNTAX, - NULL, "invalid new rdn", 0, NULL); + newrdn = slapi_create_dn_string("%s", rawnewrdn); + if (rawnewrdn && (NULL == newrdn)) { + op_shared_log_error_access(pb, "MODRDN", rawnewrdn, "invalid newrdn"); + send_ldap_result(pb, LDAP_INVALID_DN_SYNTAX, + NULL, "invalid newrdn", 0, NULL); slapi_ch_free_string( &rawnewrdn ); slapi_ch_free_string( &rawnewsuperior ); goto free_and_return; - } else if (err > 0) { - slapi_ch_free((void **) &rawnewrdn); - } else { /* err == 0; rawnewdn is passed in; not null terminated */ - *(newrdn + dnlen) = '\0'; } + slapi_dn_ignore_case( newrdn ); + slapi_ch_free_string( &rawnewrdn ); + if (rawnewsuperior) { if (config_get_dn_validate_strict()) { /* check that the dn is formatted correctly */ @@ -210,19 +207,8 @@ do_modrdn( Slapi_PBlock *pb ) goto free_and_return; } } - err = slapi_dn_normalize_ext(rawnewsuperior, 0, &newsuperior, &dnlen); - if (err < 0) { - op_shared_log_error_access(pb, "MODRDN", rawnewsuperior, - "invalid new superior"); - send_ldap_result(pb, LDAP_INVALID_DN_SYNTAX, - NULL, "invalid new superior", 0, NULL); - slapi_ch_free_string( &rawnewsuperior); - goto free_and_return; - } else if (err > 0) { - slapi_ch_free((void **) &rawnewsuperior); - } else { /* err == 0; rawnewsuperior is passed in; not terminated */ - *(newsuperior + dnlen) = '\0'; - } + snewsuperior = slapi_sdn_new_dn_passin(rawnewsuperior); + newsuperior = slapi_sdn_get_dn(snewsuperior); }
/* @@ -230,27 +216,24 @@ do_modrdn( Slapi_PBlock *pb ) * Note: need to check the case newrdn is given, and newsuperior * uses the newrdn, as well. */ - /* Both newrdn and dn are already normalized. */ - parent = slapi_dn_parent(dn); + parent = slapi_dn_parent(slapi_sdn_get_ndn(&sdn)); newdn = slapi_ch_smprintf("%s,%s", newrdn, parent); - slapi_sdn_set_dn_byref(&sdn, dn); - slapi_sdn_set_dn_byref(&snewdn, newdn); - slapi_sdn_set_dn_byref(&snewsuperior, newsuperior); - if (0 == slapi_sdn_compare(&sdn, &snewsuperior) || - 0 == slapi_sdn_compare(&snewdn, &snewsuperior)) { - op_shared_log_error_access(pb, "MODRDN", rawnewsuperior, + slapi_sdn_init_normdn_passin(&snewdn, newdn); /* newdn is normalized */ + if (0 == slapi_sdn_compare(&sdn, snewsuperior) || + 0 == slapi_sdn_compare(&snewdn, snewsuperior)) { + op_shared_log_error_access(pb, "MODRDN", newsuperior, "new superior is identical to the entry dn"); send_ldap_result(pb, LDAP_UNWILLING_TO_PERFORM, NULL, "new superior is identical to the entry dn", 0, NULL); goto free_and_return; } - if (slapi_sdn_issuffix(&snewsuperior, &sdn) || - slapi_sdn_issuffix(&snewsuperior, &snewdn)) { + if (slapi_sdn_issuffix(snewsuperior, &sdn) || + slapi_sdn_issuffix(snewsuperior, &snewdn)) { /* E.g., * newsuperior: ou=sub,ou=people,dc=example,dc=com * dn: ou=people,dc=example,dc=com */ - op_shared_log_error_access(pb, "MODRDN", rawnewsuperior, + op_shared_log_error_access(pb, "MODRDN", newsuperior, "new superior is descendent of the entry"); send_ldap_result(pb, LDAP_UNWILLING_TO_PERFORM, NULL, "new superior is descendent of the entry", 0, NULL); @@ -273,24 +256,22 @@ do_modrdn( Slapi_PBlock *pb ) deloldrdn );
slapi_pblock_set( pb, SLAPI_REQUESTOR_ISROOT, &pb->pb_op->o_isroot ); - slapi_pblock_set( pb, SLAPI_ORIGINAL_TARGET, dn ); - slapi_pblock_set( pb, SLAPI_MODRDN_NEWRDN, newrdn ); - slapi_pblock_set( pb, SLAPI_MODRDN_NEWSUPERIOR, newsuperior ); + /* dn, newrdn and newsuperior are all normalized */ + slapi_pblock_set( pb, SLAPI_ORIGINAL_TARGET, + (void *)slapi_sdn_get_udn(&sdn) ); + slapi_pblock_set( pb, SLAPI_MODRDN_TARGET_SDN, &sdn ); + slapi_pblock_set( pb, SLAPI_MODRDN_NEWRDN, (void *)newrdn ); + slapi_pblock_set( pb, SLAPI_MODRDN_NEWSUPERIOR_SDN, (void *)snewsuperior ); slapi_pblock_set( pb, SLAPI_MODRDN_DELOLDRDN, &deloldrdn );
- op_shared_rename(pb, 1 /* pass in ownership of string arguments */ ); - goto ok_return; + op_shared_rename(pb, 0 /* do not pass in ownership of string arguments */ );
free_and_return: - slapi_ch_free_string( &dn ); - slapi_ch_free_string( &newrdn ); - slapi_ch_free_string( &newsuperior ); -ok_return: slapi_sdn_done(&sdn); + slapi_ch_free_string(&newrdn); + slapi_sdn_free(&snewsuperior); slapi_sdn_done(&snewdn); - slapi_sdn_done(&snewsuperior); slapi_ch_free_string(&parent); - slapi_ch_free_string(&newdn);
return; } @@ -311,20 +292,28 @@ slapi_rename_internal(const char *iodn, const char *inewrdn, const char *inewsup Slapi_PBlock pb; Slapi_PBlock *result_pb = NULL; int opresult= 0; + Slapi_DN sdn; + Slapi_DN newsuperiorsdn;
pblock_init (&pb);
- slapi_rename_internal_set_pb (&pb, iodn, inewrdn, inewsuperior, deloldrdn, - controls, NULL, plugin_get_default_component_id(), 0); + slapi_sdn_init_dn_byref(&sdn, iodn); + slapi_sdn_init_dn_byref(&newsuperiorsdn, inewsuperior); + + slapi_rename_internal_set_pb_ext(&pb, &sdn, inewrdn, &newsuperiorsdn, + deloldrdn, controls, NULL, + plugin_get_default_component_id(), 0); rename_internal_pb (&pb);
result_pb = slapi_pblock_new(); - if (result_pb) - { - slapi_pblock_get(&pb, SLAPI_PLUGIN_INTOP_RESULT, &opresult); - slapi_pblock_set(result_pb, SLAPI_PLUGIN_INTOP_RESULT, &opresult); + if (result_pb) { + slapi_pblock_get(&pb, SLAPI_PLUGIN_INTOP_RESULT, &opresult); + slapi_pblock_set(result_pb, SLAPI_PLUGIN_INTOP_RESULT, &opresult); } - pblock_done(&pb); + + slapi_sdn_done(&sdn); + slapi_sdn_done(&newsuperiorsdn); + pblock_done(&pb);
return result_pb; } @@ -352,32 +341,39 @@ int slapi_modrdn_internal_pb (Slapi_PBlock *pb) return rename_internal_pb (pb); }
-/* Initialize a pblock for a call to slapi_modrdn_internal_pb() */ -void slapi_rename_internal_set_pb (Slapi_PBlock *pb, const char *olddn, const char *newrdn, const char *newsuperior, int deloldrdn, - LDAPControl **controls, const char *uniqueid, Slapi_ComponentId *plugin_identity, int operation_flags) +void +slapi_rename_internal_set_pb_ext(Slapi_PBlock *pb, + const Slapi_DN *olddn, + const char *newrdn, /* normalized */ + const Slapi_DN *newsuperior, int deloldrdn, + LDAPControl **controls, const char *uniqueid, + Slapi_ComponentId *plugin_identity, + int operation_flags) { - Operation *op; - PR_ASSERT (pb != NULL); - if (pb == NULL || olddn == NULL || newrdn == NULL) - { - slapi_log_error(SLAPI_LOG_FATAL, NULL, - "slapi_rename_internal_set_pb: NULL parameter\n"); - return; - } + Operation *op; + PR_ASSERT (pb != NULL); + if (pb == NULL || olddn == NULL || newrdn == NULL) + { + slapi_log_error(SLAPI_LOG_FATAL, NULL, + "slapi_rename_internal_set_pb: NULL parameter\n"); + return; + }
- op= internal_operation_new(SLAPI_OPERATION_MODRDN,operation_flags); - slapi_pblock_set(pb, SLAPI_OPERATION, op); - slapi_pblock_set(pb, SLAPI_ORIGINAL_TARGET, (void*)olddn); + op = internal_operation_new(SLAPI_OPERATION_MODRDN,operation_flags); + slapi_pblock_set(pb, SLAPI_OPERATION, op); + slapi_pblock_set(pb, SLAPI_ORIGINAL_TARGET, + (void*)slapi_sdn_get_dn(olddn)); + slapi_pblock_set(pb, SLAPI_MODRDN_TARGET_SDN, (void*)olddn); slapi_pblock_set(pb, SLAPI_MODRDN_NEWRDN, (void*)newrdn); - slapi_pblock_set(pb, SLAPI_MODRDN_NEWSUPERIOR, (void*)newsuperior); + slapi_pblock_set(pb, SLAPI_MODRDN_NEWSUPERIOR_SDN, (void*)newsuperior); slapi_pblock_set(pb, SLAPI_MODRDN_DELOLDRDN, &deloldrdn); - slapi_pblock_set(pb, SLAPI_CONTROLS_ARG, controls); - slapi_pblock_set(pb, SLAPI_MODIFY_MODS, NULL); - if (uniqueid) - { - slapi_pblock_set(pb, SLAPI_TARGET_UNIQUEID, (void*)uniqueid); - } - slapi_pblock_set(pb, SLAPI_PLUGIN_IDENTITY, plugin_identity); + slapi_pblock_set(pb, SLAPI_CONTROLS_ARG, controls); + slapi_pblock_set(pb, SLAPI_MODIFY_MODS, NULL); + if (uniqueid) + { + slapi_pblock_set(pb, SLAPI_TARGET_UNIQUEID, (void*)uniqueid); + } + slapi_pblock_set(pb, SLAPI_PLUGIN_IDENTITY, plugin_identity); }
/* Helper functions */ @@ -418,18 +414,19 @@ static int rename_internal_pb (Slapi_PBlock *pb) * Beware: this function resets the following pblock elements that were * set by the caller: * - * SLAPI_MODRDN_TARGET + * SLAPI_MODRDN_TARGET_SDN * SLAPI_MODRDN_NEWRDN - * SLAPI_MODRDN_NEWSUPERIOR + * SLAPI_MODRDN_NEWSUPERIOR_SDN */ static void op_shared_rename(Slapi_PBlock *pb, int passin_args) { - char *dn, *newsuperior, *newrdn, *newdn = NULL; + char *dn, *newrdn, *newdn = NULL; + const char *newsuperior; char **rdns; int deloldrdn; Slapi_Backend *be = NULL; - Slapi_DN sdn = {0}; + Slapi_DN *origsdn = NULL; Slapi_Mods smods; char dnbuf[BUFSIZ]; char newrdnbuf[BUFSIZ]; @@ -443,13 +440,16 @@ op_shared_rename(Slapi_PBlock *pb, int passin_args) char *proxystr = NULL; int proxy_err = LDAP_SUCCESS; char *errtext = NULL; + Slapi_DN *sdn = NULL; + Slapi_DN *newsuperiorsdn = NULL;
slapi_pblock_get(pb, SLAPI_ORIGINAL_TARGET, &dn); slapi_pblock_get(pb, SLAPI_MODRDN_NEWRDN, &newrdn); - slapi_pblock_get(pb, SLAPI_MODRDN_NEWSUPERIOR, &newsuperior); + slapi_pblock_get(pb, SLAPI_MODRDN_NEWSUPERIOR_SDN, &newsuperiorsdn); slapi_pblock_get(pb, SLAPI_MODRDN_DELOLDRDN, &deloldrdn); slapi_pblock_get(pb, SLAPI_IS_REPLICATED_OPERATION, &repl_op); slapi_pblock_get (pb, SLAPI_OPERATION, &operation); + slapi_pblock_get(pb, SLAPI_MODRDN_TARGET_SDN, &origsdn); internal_op= operation_is_flag_set(operation, OP_FLAG_INTERNAL);
/* @@ -462,26 +462,31 @@ op_shared_rename(Slapi_PBlock *pb, int passin_args) * that we will not free these parameters... so if passin_args is * zero, we need to make copies. * - * In the case of SLAPI_MODRDN_TARGET and SLAPI_MODRDN_NEWSUPERIOR, we - * replace the existing values with normalized values (because plugins + * In the case of SLAPI_MODRDN_TARGET_SDN and SLAPI_MODRDN_NEWSUPERIOR_SDN, + * we replace the existing values with normalized values (because plugins * expect these DNs to be normalized). */ - if ( passin_args ) { - slapi_sdn_init_dn_passin(&sdn,dn); /* freed by slapi_sdn_done() */ + + if (NULL == origsdn) { + sdn = slapi_sdn_new_dn_byval(dn); + slapi_pblock_set(pb, SLAPI_MODRDN_TARGET_SDN, sdn); + } + if (passin_args) { + if (NULL == sdn) { /* origsdn is not NULL, so use it. */ + sdn = origsdn; + } } else { - slapi_sdn_init_dn_byref(&sdn,dn); - } - if ( !passin_args ) { - newrdn = slapi_ch_strdup( newrdn ); - newsuperior = slapi_ch_strdup( newsuperior ); - } - if ( NULL != newsuperior ) { - slapi_dn_normalize_case( newsuperior ); /* normalize in place */ + if (NULL == sdn) { + sdn = slapi_sdn_dup(origsdn); + } + newrdn = slapi_ch_strdup(newrdn); + newsuperiorsdn = slapi_sdn_dup(newsuperiorsdn); + slapi_pblock_set(pb, SLAPI_MODRDN_TARGET_SDN, sdn); + slapi_pblock_set(pb, SLAPI_MODRDN_NEWRDN, (void *)newrdn); + slapi_pblock_set(pb, SLAPI_MODRDN_NEWSUPERIOR_SDN, newsuperiorsdn); } - slapi_pblock_set (pb, SLAPI_MODRDN_TARGET, - (void*)slapi_ch_strdup(slapi_sdn_get_ndn (&sdn))); - slapi_pblock_set(pb, SLAPI_MODRDN_NEWRDN, (void *)newrdn ); - slapi_pblock_set(pb, SLAPI_MODRDN_NEWSUPERIOR, (void *)newsuperior); + /* normdn = slapi_sdn_get_dn(sdn); */ + newsuperior = slapi_sdn_get_dn(newsuperiorsdn);
/* get the proxy auth dn if the proxy auth control is present */ proxy_err = proxyauth_get_dn(pb, &proxydn, &errtext); @@ -589,13 +594,13 @@ op_shared_rename(Slapi_PBlock *pb, int passin_args) }
/* target spec is used to decide which plugins are applicable for the operation */ - operation_set_target_spec (pb->pb_op, &sdn); + operation_set_target_spec (pb->pb_op, sdn);
/* - * Construct the new DN (code copied from backend + * Construct the new DN (code sdn from backend * and modified to handle newsuperior) */ - newdn = slapi_moddn_get_newdn(&sdn,newrdn,newsuperior); + newdn = slapi_moddn_get_newdn(sdn, newrdn, newsuperior);
/* * We could be serving multiple database backends. Select the @@ -695,8 +700,20 @@ free_and_return_nolock: LDAPMod **mods; char *s;
- slapi_ch_free((void **) &newdn); - slapi_sdn_done(&sdn); + if (passin_args) { + if (NULL == origsdn) { + slapi_sdn_free(&sdn); + } + } else { + slapi_pblock_get(pb, SLAPI_MODRDN_TARGET_SDN, &sdn); + slapi_sdn_free(&sdn); + slapi_pblock_get(pb, SLAPI_MODRDN_NEWRDN, &newrdn); + slapi_ch_free_string(&newrdn); + slapi_pblock_get(pb, SLAPI_MODRDN_NEWSUPERIOR_SDN, &newsuperiorsdn); + slapi_sdn_free(&newsuperiorsdn); + } + slapi_ch_free_string(&newdn); + slapi_pblock_get(pb, SLAPI_ENTRY_PRE_OP, &ecopy); slapi_entry_free(ecopy); slapi_pblock_get(pb, SLAPI_ENTRY_POST_OP, &pse); @@ -706,13 +723,6 @@ free_and_return_nolock: slapi_ch_free_string(&proxydn); slapi_ch_free_string(&proxystr);
- /* retrieve these in case a pre- or post-op plugin has changed them */ - slapi_pblock_get(pb, SLAPI_MODRDN_TARGET, &s); - slapi_ch_free((void **)&s); - slapi_pblock_get(pb, SLAPI_MODRDN_NEWRDN, &s); - slapi_ch_free((void **)&s); - slapi_pblock_get(pb, SLAPI_MODRDN_NEWSUPERIOR, &s); - slapi_ch_free((void **)&s); slapi_pblock_get(pb, SLAPI_URP_NAMING_COLLISION_DN, &s); slapi_ch_free((void **)&s); } diff --git a/ldap/servers/slapd/modutil.c b/ldap/servers/slapd/modutil.c index 82147c6..8818817 100644 --- a/ldap/servers/slapd/modutil.c +++ b/ldap/servers/slapd/modutil.c @@ -201,21 +201,12 @@ slapi_mods_insert_at(Slapi_Mods *smods, LDAPMod *mod, int pos) 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; + Slapi_DN *sdn = slapi_sdn_new_dn_byref((*mbvp)->bv_val); + (*mbvp)->bv_val = slapi_ch_strdup(slapi_sdn_get_dn(sdn)); + (*mbvp)->bv_len = slapi_sdn_get_ndn_len(sdn); + slapi_sdn_free(&sdn); } } attr_done(&a); diff --git a/ldap/servers/slapd/operation.c b/ldap/servers/slapd/operation.c index 185723e..1479ee9 100644 --- a/ldap/servers/slapd/operation.c +++ b/ldap/servers/slapd/operation.c @@ -398,17 +398,17 @@ copy_mods(LDAPMod **orig_mods) struct slapi_operation_parameters * operation_parameters_dup(struct slapi_operation_parameters *sop) { - struct slapi_operation_parameters *sop_new= (struct slapi_operation_parameters *) + struct slapi_operation_parameters *sop_new = (struct slapi_operation_parameters *) slapi_ch_malloc(sizeof(struct slapi_operation_parameters)); memcpy(sop_new,sop,sizeof(struct slapi_operation_parameters)); - if(sop->target_address.dn!=NULL) - { - sop_new->target_address.dn= slapi_ch_strdup(sop->target_address.dn); - } if(sop->target_address.uniqueid!=NULL) { sop_new->target_address.uniqueid= slapi_ch_strdup(sop->target_address.uniqueid); } + if(sop->target_address.sdn != NULL) + { + sop_new->target_address.sdn = slapi_sdn_dup(sop->target_address.sdn); + }
sop_new->csn= csn_dup(sop->csn); switch(sop->operation_type) @@ -429,10 +429,10 @@ operation_parameters_dup(struct slapi_operation_parameters *sop) { sop_new->p.p_modrdn.modrdn_newrdn= slapi_ch_strdup(sop->p.p_modrdn.modrdn_newrdn); } - if(sop->p.p_modrdn.modrdn_newsuperior_address.dn!=NULL) + if(sop->p.p_modrdn.modrdn_newsuperior_address.sdn!=NULL) { - sop_new->p.p_modrdn.modrdn_newsuperior_address.dn = - slapi_ch_strdup(sop->p.p_modrdn.modrdn_newsuperior_address.dn); + sop_new->p.p_modrdn.modrdn_newsuperior_address.sdn = + slapi_sdn_dup(sop->p.p_modrdn.modrdn_newsuperior_address.sdn); } if(sop->p.p_modrdn.modrdn_newsuperior_address.uniqueid!=NULL) { @@ -462,8 +462,9 @@ operation_parameters_done (struct slapi_operation_parameters *sop) { if(sop!=NULL) { - slapi_ch_free((void **)&sop->target_address.dn); slapi_ch_free((void **)&sop->target_address.uniqueid); + slapi_sdn_free(&sop->target_address.sdn); + csn_free(&sop->csn); switch(sop->operation_type) @@ -479,7 +480,6 @@ operation_parameters_done (struct slapi_operation_parameters *sop) break; case SLAPI_OPERATION_MODRDN: slapi_ch_free((void **)&(sop->p.p_modrdn.modrdn_newrdn)); - slapi_ch_free((void **)&(sop->p.p_modrdn.modrdn_newsuperior_address.dn)); slapi_ch_free((void **)&(sop->p.p_modrdn.modrdn_newsuperior_address.uniqueid)); ldap_mods_free(sop->p.p_modrdn.modrdn_mods, 1 /* Free the Array and the Elements */); sop->p.p_modrdn.modrdn_mods= NULL; @@ -504,8 +504,3 @@ void operation_parameters_free(struct slapi_operation_parameters **sop) slapi_ch_free ((void**)sop); } } - - - - - diff --git a/ldap/servers/slapd/opshared.c b/ldap/servers/slapd/opshared.c index 1af97c6..f2ef9cc 100644 --- a/ldap/servers/slapd/opshared.c +++ b/ldap/servers/slapd/opshared.c @@ -188,7 +188,9 @@ void modify_update_last_modified_attr(Slapi_PBlock *pb, Slapi_Mods *smods) void op_shared_search (Slapi_PBlock *pb, int send_result) { - char *base, *fstr; + char *base = NULL; + const char *normbase = NULL; + char *fstr; int scope; Slapi_Backend *be = NULL; Slapi_Backend *be_single = NULL; @@ -198,7 +200,8 @@ op_shared_search (Slapi_PBlock *pb, int send_result) char attrlistbuf[ 1024 ], *attrliststr, **attrs = NULL; int rc = 0; int internal_op; - Slapi_DN sdn; + Slapi_DN *basesdn = NULL; + Slapi_DN *sdn = NULL; Slapi_Operation *operation; Slapi_Entry *referral = NULL; char *proxydn = NULL; @@ -225,14 +228,30 @@ op_shared_search (Slapi_PBlock *pb, int send_result) int curr_search_count = 0; Slapi_Backend *pr_be = NULL; void *pr_search_result = NULL; - int pr_search_result_count = 0; int pr_reset_processing = 0;
be_list[0] = NULL; referral_list[0] = NULL;
/* get search parameters */ - slapi_pblock_get(pb, SLAPI_SEARCH_TARGET, &base); + slapi_pblock_get(pb, SLAPI_ORIGINAL_TARGET_DN, &base); + slapi_pblock_get(pb, SLAPI_SEARCH_TARGET_SDN, &sdn); + + if (NULL == sdn) { + sdn = slapi_sdn_new_dn_byval(base); + slapi_pblock_set(pb, SLAPI_SEARCH_TARGET_SDN, sdn); + } + normbase = slapi_sdn_get_dn(sdn); + + if (base && (strlen(base) > 0) && (NULL == normbase)) { + /* normalization failed */ + op_shared_log_error_access(pb, "SRCH", base, "invalid dn"); + send_ldap_result(pb, LDAP_INVALID_DN_SYNTAX, NULL, "invalid dn", 0, NULL); + rc = -1; + goto free_and_return_nolock; + } + basesdn = slapi_sdn_dup(sdn); + slapi_pblock_get(pb, SLAPI_SEARCH_SCOPE, &scope); slapi_pblock_get(pb, SLAPI_SEARCH_STRFILTER, &fstr); slapi_pblock_get(pb, SLAPI_SEARCH_ATTRS, &attrs); @@ -240,8 +259,6 @@ op_shared_search (Slapi_PBlock *pb, int send_result) internal_op= operation_is_flag_set(operation, OP_FLAG_INTERNAL); flag_psearch = operation_is_flag_set(operation, OP_FLAG_PS);
- slapi_sdn_init_dn_byref(&sdn, base); - /* get the proxy auth dn if the proxy auth control is present */ proxy_err = proxyauth_get_dn(pb, &proxydn, &errtext);
@@ -298,7 +315,7 @@ op_shared_search (Slapi_PBlock *pb, int send_result) slapi_log_access(LDAP_DEBUG_STATS, fmtstr, pb->pb_conn->c_connid, pb->pb_op->o_opid, - escape_string(slapi_sdn_get_dn (&sdn), ebuf), + escape_string(normbase, ebuf), scope, fstr, attrliststr, flag_psearch ? " options=persistent" : "", proxystr ? proxystr : ""); @@ -308,7 +325,7 @@ op_shared_search (Slapi_PBlock *pb, int send_result) slapi_log_access(LDAP_DEBUG_ARGS, fmtstr, LOG_INTERNAL_OP_CON_ID, LOG_INTERNAL_OP_OP_ID, - escape_string(slapi_sdn_get_dn (&sdn), ebuf), + escape_string(normbase, ebuf), scope, fstr, attrliststr, flag_psearch ? " options=persistent" : "", proxystr ? proxystr : ""); @@ -316,7 +333,8 @@ op_shared_search (Slapi_PBlock *pb, int send_result) }
/* If we encountered an error parsing the proxy control, return an error - * to the client. We do this here to ensure that we log the operation first. */ + * to the client. We do this here to ensure that we log the operation first. + */ if (proxy_err != LDAP_SUCCESS) { rc = -1; @@ -324,10 +342,10 @@ op_shared_search (Slapi_PBlock *pb, int send_result) goto free_and_return_nolock; }
- slapi_pblock_set(pb, SLAPI_SEARCH_TARGET, (void*)slapi_sdn_get_ndn (&sdn)); - - /* target spec is used to decide which plugins are applicable for the operation */ - operation_set_target_spec (pb->pb_op, &sdn); + /* target spec is used to decide which plugins are applicable for + * the operation. basesdn is duplicated and set to target spec. + */ + operation_set_target_spec (pb->pb_op, basesdn);
/* this is time to check if mapping tree specific control * was used to specify that we want to parse only @@ -352,7 +370,7 @@ op_shared_search (Slapi_PBlock *pb, int send_result) else { /* we don't need no steenkin values */ - Slapi_Backend *searchbe = slapi_be_select( &sdn ); + Slapi_Backend *searchbe = slapi_be_select( sdn );
if(searchbe && searchbe != defbackend_get_backend()) { @@ -406,8 +424,6 @@ op_shared_search (Slapi_PBlock *pb, int send_result) operation->o_flags |= OP_FLAG_PAGED_RESULTS; pr_be = pagedresults_get_current_be(pb->pb_conn); pr_search_result = pagedresults_get_search_result(pb->pb_conn); - pr_search_result_count = - pagedresults_get_search_result_count(pb->pb_conn); estimate = pagedresults_get_search_result_set_size_estimate(pb->pb_conn); if (pagedresults_get_unindexed(pb->pb_conn)) { @@ -501,11 +517,23 @@ op_shared_search (Slapi_PBlock *pb, int send_result) goto free_and_return;
case -2: /* memory was allocated */ - /* take note of any changes */ - slapi_pblock_get(pb, SLAPI_SEARCH_TARGET, &base); + /* take note of any changes */ + slapi_pblock_get(pb, SLAPI_SEARCH_TARGET_SDN, &sdn); slapi_pblock_get(pb, SLAPI_SEARCH_SCOPE, &scope); - - slapi_sdn_set_dn_byref(&sdn, base); + if (NULL == sdn) { + send_ldap_result(pb, LDAP_UNWILLING_TO_PERFORM, NULL, + "target dn is lost", 0, NULL); + rc = -1; + goto free_and_return; + } + if (slapi_sdn_compare(basesdn, sdn)) { + slapi_sdn_free(&basesdn); + basesdn = operation_get_target_spec(pb->pb_op); + slapi_sdn_free(&basesdn); + basesdn = slapi_sdn_dup(sdn); + operation_set_target_spec (pb->pb_op, basesdn); + } + normbase = slapi_sdn_get_dn(sdn); break;
case -1: @@ -551,7 +579,7 @@ op_shared_search (Slapi_PBlock *pb, int send_result) rc = -1; /* zero backends would mean failure */ while (be) { - const Slapi_DN * be_suffix; + const Slapi_DN *be_suffix; int err = 0; Slapi_Backend *next_be = NULL;
@@ -570,7 +598,7 @@ op_shared_search (Slapi_PBlock *pb, int send_result) * is below another backend because in that case the * such searches should sometimes succeed * To allow this we therefore have to change the - * SLAPI_SEARCH_TARGET parameter in the pblock + * SLAPI_SEARCH_TARGET_SDN parameter in the pblock * * Also when we climb down the mapping tree we have to * change ONE-LEVEL searches to BASE @@ -636,25 +664,27 @@ op_shared_search (Slapi_PBlock *pb, int send_result) { if ((be_name == NULL) && (scope == LDAP_SCOPE_ONELEVEL)) { - /* one level searches - * - depending on the suffix of the backend we might have to - * do a one level search or a base search - * - we might also have to change the search target - */ - if (slapi_sdn_isparent(&sdn, be_suffix) - || (slapi_sdn_get_ndn_len(&sdn) == 0)) + /* one level searches + * - depending on the suffix of the backend we might have to + * do a one level search or a base search + * - we might also have to change the search target + */ + if (slapi_sdn_isparent(basesdn, be_suffix) || + (slapi_sdn_get_ndn_len(basesdn) == 0)) { int tmp_scope = LDAP_SCOPE_BASE; slapi_pblock_set(pb, SLAPI_SEARCH_SCOPE, &tmp_scope); - slapi_pblock_set(pb, SLAPI_SEARCH_TARGET, - (void *)slapi_sdn_get_ndn(be_suffix)); + + slapi_pblock_get(pb, SLAPI_SEARCH_TARGET_SDN, &sdn); + slapi_sdn_free(&sdn); + sdn = slapi_sdn_dup(be_suffix); + slapi_pblock_set(pb, SLAPI_SEARCH_TARGET_SDN, (void *)sdn); + normbase = slapi_sdn_get_dn(sdn); } - else if (slapi_sdn_issuffix(&sdn, be_suffix)) + else if (slapi_sdn_issuffix(basesdn, be_suffix)) { int tmp_scope = LDAP_SCOPE_ONELEVEL; slapi_pblock_set(pb, SLAPI_SEARCH_SCOPE, &tmp_scope); - slapi_pblock_set(pb, SLAPI_SEARCH_TARGET, - (void *)slapi_sdn_get_ndn (&sdn)); } else goto next_be; @@ -662,19 +692,20 @@ op_shared_search (Slapi_PBlock *pb, int send_result)
/* subtree searches : * if the search was started above the backend suffix - * - temporarily set the SLAPI_SEARCH_TARGET to the + * - temporarily set the SLAPI_SEARCH_TARGET_SDN to the * base of the node so that we don't get a NO SUCH OBJECT error * - do not change the scope */ if (scope == LDAP_SCOPE_SUBTREE) { - if (slapi_sdn_issuffix(be_suffix, &sdn)) + if (slapi_sdn_issuffix(be_suffix, basesdn)) { - slapi_pblock_set(pb, SLAPI_SEARCH_TARGET, - (void *)slapi_sdn_get_ndn(be_suffix)); + slapi_pblock_get(pb, SLAPI_SEARCH_TARGET_SDN, &sdn); + slapi_sdn_free(&sdn); + sdn = slapi_sdn_dup(be_suffix); + slapi_pblock_set(pb, SLAPI_SEARCH_TARGET_SDN, (void *)sdn); + normbase = slapi_sdn_get_dn(sdn); } - else - slapi_pblock_set(pb, SLAPI_SEARCH_TARGET, (void *)slapi_sdn_get_ndn(&sdn)); } }
@@ -886,11 +917,15 @@ free_and_return: else if (be_single) slapi_be_Unlock(be_single);
- free_and_return_nolock: - slapi_pblock_set(pb, SLAPI_SEARCH_TARGET, base); +free_and_return_nolock: slapi_pblock_set(pb, SLAPI_PLUGIN_OPRETURN, &rc); index_subsys_filter_decoders_done(pb); - slapi_sdn_done(&sdn); + + slapi_pblock_get(pb, SLAPI_SEARCH_TARGET_SDN, &sdn); + slapi_sdn_free(&sdn); + slapi_sdn_free(&basesdn); + slapi_pblock_set(pb, SLAPI_SEARCH_TARGET_SDN, NULL); + slapi_ch_free_string(&proxydn); slapi_ch_free_string(&proxystr); if (pr_reset_processing) { @@ -1146,10 +1181,8 @@ iterate(Slapi_PBlock *pb, Slapi_Backend *be, int send_result, { Slapi_Entry *gerentry = NULL; Slapi_Operation *operation; - int is_paged = 0;
slapi_pblock_get (pb, SLAPI_OPERATION, &operation); - is_paged = operation->o_flags & OP_FLAG_PAGED_RESULTS; rc = be->be_next_search_entry(pb); if (rc < 0) { diff --git a/ldap/servers/slapd/passwd_extop.c b/ldap/servers/slapd/passwd_extop.c index c1f00d2..c77d3b7 100644 --- a/ldap/servers/slapd/passwd_extop.c +++ b/ldap/servers/slapd/passwd_extop.c @@ -145,7 +145,8 @@ passwd_modify_getEntry( const char *dn, Slapi_Entry **e2 ) { /* Construct Mods pblock and perform the modify operation * Sets result of operation in SLAPI_PLUGIN_INTOP_RESULT */ -static int passwd_apply_mods(Slapi_PBlock *pb_orig, const char *dn, Slapi_Mods *mods, +static int +passwd_apply_mods(Slapi_PBlock *pb_orig, const Slapi_DN *sdn, Slapi_Mods *mods, LDAPControl **req_controls, LDAPControl ***resp_controls) { Slapi_PBlock pb; @@ -164,7 +165,7 @@ static int passwd_apply_mods(Slapi_PBlock *pb_orig, const char *dn, Slapi_Mods * }
pblock_init(&pb); - slapi_modify_internal_set_pb (&pb, dn, + slapi_modify_internal_set_pb_ext (&pb, sdn, slapi_mods_get_ldapmods_byref(mods), req_controls_copy, NULL, /* UniqueID */ plugin_get_default_component_id(), /* PluginID */ @@ -195,7 +196,7 @@ static int passwd_apply_mods(Slapi_PBlock *pb_orig, const char *dn, Slapi_Mods *
if (ret != LDAP_SUCCESS){ LDAPDebug(LDAP_DEBUG_TRACE, "WARNING: passwordPolicy modify error %d on entry '%s'\n", - ret, dn, 0); + ret, slapi_sdn_get_dn(sdn), 0); }
pblock_done(&pb); @@ -212,18 +213,17 @@ static int passwd_apply_mods(Slapi_PBlock *pb_orig, const char *dn, Slapi_Mods * static int passwd_modify_userpassword(Slapi_PBlock *pb_orig, Slapi_Entry *targetEntry, const char *newPasswd, LDAPControl **req_controls, LDAPControl ***resp_controls) { - char *dn = NULL; int ret = 0; Slapi_Mods smods; LDAPDebug( LDAP_DEBUG_TRACE, "=> passwd_modify_userpassword\n", 0, 0, 0 ); slapi_mods_init (&smods, 0); - dn = slapi_entry_get_ndn( targetEntry ); slapi_mods_add_string(&smods, LDAP_MOD_REPLACE, SLAPI_USERPWD_ATTR, newPasswd);
- ret = passwd_apply_mods(pb_orig, dn, &smods, req_controls, resp_controls); + ret = passwd_apply_mods(pb_orig, slapi_entry_get_sdn_const(targetEntry), + &smods, req_controls, resp_controls);
slapi_mods_done(&smods); @@ -238,7 +238,6 @@ static int passwd_modify_generate_basic_passwd( int passlen, char **genpasswd ) char *data = NULL; char *enc = NULL; int datalen = LDAP_EXTOP_PASSMOD_RANDOM_BYTES; - int enclen = LDAP_EXTOP_PASSMOD_GEN_PASSWD_LEN + 1;
if ( genpasswd == NULL ) { return LDAP_OPERATIONS_ERROR; @@ -246,7 +245,6 @@ static int passwd_modify_generate_basic_passwd( int passlen, char **genpasswd )
if ( passlen > 0 ) { datalen = passlen * 3 / 4 + 1; - enclen = datalen * 4; /* allocate the large enough space */ }
data = slapi_ch_calloc( datalen, 1 ); @@ -454,10 +452,10 @@ passwd_modify_extop( Slapi_PBlock *pb ) { char *oid = NULL; char *bindDN = NULL; + Slapi_DN *bindSDN = NULL; char *authmethod = NULL; char *rawdn = NULL; - char *dn = NULL; - size_t dnlen = 0; + const char *dn = NULL; char *otdn = NULL; char *oldPasswd = NULL; char *newPasswd = NULL; @@ -582,15 +580,13 @@ passwd_modify_extop( Slapi_PBlock *pb ) if (tag == LDAP_EXTOP_PASSMOD_TAG_USERID ) { int rc = 0; - if ( ber_scanf( ber, "a", &rawdn) == LBER_ERROR ) - { - slapi_ch_free_string(&rawdn); - LDAPDebug( LDAP_DEBUG_ANY, - "ber_scanf failed :{\n", 0, 0, 0 ); - errMesg = "ber_scanf failed at userID parse.\n"; - rc = LDAP_PROTOCOL_ERROR; - goto free_and_return; - } + if ( ber_scanf( ber, "a", &rawdn) == LBER_ERROR ) { + slapi_ch_free_string(&rawdn); + LDAPDebug( LDAP_DEBUG_ANY, "ber_scanf failed :{\n", 0, 0, 0 ); + errMesg = "ber_scanf failed at userID parse.\n"; + rc = LDAP_PROTOCOL_ERROR; + goto free_and_return; + }
/* Check if we should be performing strict validation. */ if (config_get_dn_validate_strict()) { @@ -605,50 +601,31 @@ passwd_modify_extop( Slapi_PBlock *pb ) goto free_and_return; } } - rc = slapi_dn_normalize_ext(rawdn, 0, &dn, &dnlen); - if (rc < 0) { - op_shared_log_error_access(pb, "EXT", rawdn?rawdn:"", - "invalid target dn"); - slapi_ch_free_string(&rawdn); - errMesg = "invalid target dn.\n"; - rc = LDAP_INVALID_SYNTAX; - goto free_and_return; - } else if (rc == 0) { /* rawdn is passed in, not terminated */ - *(dn + dnlen) = '\0'; - } else { - slapi_ch_free_string(&rawdn); - } - tag = ber_peek_tag( ber, &len); + tag = ber_peek_tag(ber, &len); } - /* identify oldPasswd field by tags */ - if (tag == LDAP_EXTOP_PASSMOD_TAG_OLDPWD ) - { - if ( ber_scanf( ber, "a", &oldPasswd ) == LBER_ERROR ) - { - slapi_ch_free_string(&oldPasswd); - LDAPDebug( LDAP_DEBUG_ANY, - "ber_scanf failed :{\n", 0, 0, 0 ); - errMesg = "ber_scanf failed at oldPasswd parse.\n"; - rc = LDAP_PROTOCOL_ERROR; - goto free_and_return; - } + if (tag == LDAP_EXTOP_PASSMOD_TAG_OLDPWD ) { + if ( ber_scanf( ber, "a", &oldPasswd ) == LBER_ERROR ) { + slapi_ch_free_string(&oldPasswd); + LDAPDebug( LDAP_DEBUG_ANY, "ber_scanf failed :{\n", 0, 0, 0 ); + errMesg = "ber_scanf failed at oldPasswd parse.\n"; + rc = LDAP_PROTOCOL_ERROR; + goto free_and_return; + } tag = ber_peek_tag( ber, &len); } /* identify newPasswd field by tags */ if (tag == LDAP_EXTOP_PASSMOD_TAG_NEWPWD ) { - if ( ber_scanf( ber, "a", &newPasswd ) == LBER_ERROR ) - { - slapi_ch_free_string(&newPasswd); - LDAPDebug( LDAP_DEBUG_ANY, - "ber_scanf failed :{\n", 0, 0, 0 ); - errMesg = "ber_scanf failed at newPasswd parse.\n"; - rc = LDAP_PROTOCOL_ERROR; - goto free_and_return; - } + if ( ber_scanf( ber, "a", &newPasswd ) == LBER_ERROR ) { + slapi_ch_free_string(&newPasswd); + LDAPDebug( LDAP_DEBUG_ANY, "ber_scanf failed :{\n", 0, 0, 0 ); + errMesg = "ber_scanf failed at newPasswd parse.\n"; + rc = LDAP_PROTOCOL_ERROR; + goto free_and_return; + } }
parse_req_done: @@ -659,14 +636,28 @@ parse_req_done: /* Get Bind DN */ slapi_pblock_get( pb, SLAPI_CONN_DN, &bindDN );
+ /* If the connection is bound anonymously, we must refuse to process this operation. */ + if (bindDN == NULL || *bindDN == '\0') { + /* Refuse the operation because they're bound anonymously */ + errMesg = "Anonymous Binds are not allowed.\n"; + rc = LDAP_INSUFFICIENT_ACCESS; + goto free_and_return; + } + /* Find and set the target DN. */ - if (dn && *dn != '\0') { - target_sdn = slapi_sdn_new_dn_byref(dn); - slapi_pblock_set(pb, SLAPI_TARGET_DN, dn); - } else if (bindDN && *bindDN != '\0') { - target_sdn = slapi_sdn_new_dn_byref(bindDN); - slapi_pblock_set(pb, SLAPI_TARGET_DN, bindDN); + if (rawdn && *rawdn != '\0') { + target_sdn = slapi_sdn_new_dn_passin(rawdn); + } else { /* We already checked (bindDN && *bindDN != '\0') above */ + target_sdn = bindSDN = slapi_sdn_new_normdn_byref(bindDN); + } + dn = slapi_sdn_get_ndn(target_sdn); + if (dn == NULL || *dn == '\0') { + /* Refuse the operation because they're bound anonymously */ + errMesg = "Invalid dn.\n"; + rc = LDAP_INVALID_DN_SYNTAX; + goto free_and_return; } + slapi_pblock_set(pb, SLAPI_TARGET_SDN, target_sdn);
/* Check if we need to send any referrals. */ if (slapi_dn_write_needs_referral(target_sdn, &referrals)) { @@ -674,14 +665,6 @@ parse_req_done: goto free_and_return; }
- /* If the connection is bound anonymously, we must refuse to process this operation. */ - if (bindDN == NULL || *bindDN == '\0') { - /* Refuse the operation because they're bound anonymously */ - errMesg = "Anonymous Binds are not allowed.\n"; - rc = LDAP_INSUFFICIENT_ACCESS; - goto free_and_return; - } - if (oldPasswd == NULL || *oldPasswd == '\0') { /* If user is authenticated, they already gave their password during * the bind operation (or used sasl or client cert auth or OS creds) */ @@ -746,19 +729,7 @@ parse_req_done: ber_free( response_ber, 1 ); } - - /* Determine the target DN for this operation */ - /* Did they give us a DN ? */ - if (dn == NULL || *dn == '\0') { - /* Get the DN from the bind identity on this connection */ - slapi_ch_free_string(&dn); - dn = slapi_ch_strdup(bindDN); - LDAPDebug( LDAP_DEBUG_ANY, - "Missing userIdentity in request, using the bind DN instead.\n", - 0, 0, 0 ); - } - - slapi_pblock_set( pb, SLAPI_ORIGINAL_TARGET, dn ); + slapi_pblock_set( pb, SLAPI_ORIGINAL_TARGET, (void *)dn );
/* Now we have the DN, look for the entry */ ret = passwd_modify_getEntry(dn, &targetEntry); @@ -826,7 +797,9 @@ parse_req_done: * this here since the normal modify code doesn't perform this check for * internal operations. */ if (!pb->pb_op->o_isroot && !pb->pb_conn->c_needpw && !pwpolicy->pw_change) { - Slapi_DN *bindSDN = slapi_sdn_new_dn_byref(bindDN); + if (NULL == bindSDN) { + bindSDN = slapi_sdn_new_normdn_byref(bindDN); + } /* Is this a user modifying their own password? */ if (slapi_sdn_compare(bindSDN, slapi_entry_get_sdn(targetEntry))==0) { if (need_pwpolicy_ctrl) { @@ -834,10 +807,8 @@ parse_req_done: } errMesg = "User is not allowed to change password\n"; rc = LDAP_UNWILLING_TO_PERFORM; - slapi_sdn_free(&bindSDN); goto free_and_return; } - slapi_sdn_free(&bindSDN); }
/* Fetch any present request controls so we can use them when @@ -879,8 +850,6 @@ free_and_return: send_ldap_result( pb, rc, NULL, errMesg, 0, NULL ); }
- slapi_sdn_free(&target_sdn); - slapi_ch_free_string(&bindDN); /* slapi_pblock_get SLAPI_CONN_DN does strdup */ slapi_ch_free_string(&oldPasswd); slapi_ch_free_string(&newPasswd); /* Either this is the same pointer that we allocated and set above, @@ -888,9 +857,16 @@ free_and_return: * value that we need to free here */ slapi_pblock_get( pb, SLAPI_ORIGINAL_TARGET, &otdn ); if (otdn != dn) { - slapi_ch_free_string(&dn); + slapi_ch_free_string(&otdn); } - slapi_ch_free_string(&otdn); + slapi_pblock_get(pb, SLAPI_TARGET_SDN, &target_sdn); + if (bindSDN != target_sdn) { + slapi_sdn_free(&bindSDN); + } + /* slapi_pblock_get SLAPI_CONN_DN does strdup */ + slapi_ch_free_string(&bindDN); + slapi_sdn_free(&target_sdn); + slapi_pblock_set(pb, SLAPI_TARGET_SDN, NULL); slapi_pblock_set( pb, SLAPI_ORIGINAL_TARGET, NULL ); slapi_ch_free_string(&authmethod); delete_passwdPolicy(&pwpolicy); diff --git a/ldap/servers/slapd/pblock.c b/ldap/servers/slapd/pblock.c index d068132..3dbd828 100644 --- a/ldap/servers/slapd/pblock.c +++ b/ldap/servers/slapd/pblock.c @@ -1121,11 +1121,31 @@ slapi_pblock_get( Slapi_PBlock *pblock, int arg, void *value ) (*(entry_address **)value) = &(pblock->pb_op->o_params.target_address); } break; - /* should be normalized */ - case SLAPI_TARGET_DN: + case SLAPI_TARGET_DN: /* DEPRECATED */ + /* The returned value refers SLAPI_TARGET_SDN. + * It should not be freed.*/ if(pblock->pb_op!=NULL) { - (*(char **)value) = pblock->pb_op->o_params.target_address.dn; + Slapi_DN *sdn = pblock->pb_op->o_params.target_address.sdn; + if (sdn) { + (*(char **)value) = (char *)slapi_sdn_get_dn(sdn); + } else { + (*(char **)value) = NULL; + } + } + else + { + return( -1 ); + } + break; + case SLAPI_TARGET_SDN: + if(pblock->pb_op!=NULL) + { + (*(Slapi_DN **)value) = pblock->pb_op->o_params.target_address.sdn; + } + else + { + return( -1 ); } break; case SLAPI_ORIGINAL_TARGET_DN: @@ -1330,11 +1350,31 @@ slapi_pblock_get( Slapi_PBlock *pblock, int arg, void *value ) (*(int *)value) = pblock->pb_op->o_params.p.p_modrdn.modrdn_deloldrdn; } break; - case SLAPI_MODRDN_NEWSUPERIOR: + case SLAPI_MODRDN_NEWSUPERIOR: /* DEPRECATED */ if(pblock->pb_op!=NULL) { - (*(char **)value) = - pblock->pb_op->o_params.p.p_modrdn.modrdn_newsuperior_address.dn; + Slapi_DN *sdn = + pblock->pb_op->o_params.p.p_modrdn.modrdn_newsuperior_address.sdn; + if (sdn) { + (*(char **)value) = (char *)slapi_sdn_get_dn(sdn); + } else { + (*(char **)value) = NULL; + } + } + else + { + return -1; + } + break; + case SLAPI_MODRDN_NEWSUPERIOR_SDN: + if(pblock->pb_op!=NULL) + { + (*(Slapi_DN **)value) = + pblock->pb_op->o_params.p.p_modrdn.modrdn_newsuperior_address.sdn; + } + else + { + return -1; } break; case SLAPI_MODRDN_PARENT_ENTRY: @@ -1725,6 +1765,18 @@ slapi_pblock_get( Slapi_PBlock *pblock, int arg, void *value ) } break;
+ case SLAPI_REQUESTOR_NDN: + /* NOTE: It's not a copy of the DN */ + if (pblock->pb_op != NULL) + { + char *ndn = (char*)slapi_sdn_get_ndn(&pblock->pb_op->o_sdn); + if(ndn == NULL) + (*( char **)value ) = ""; + else + (*( char **)value ) = ndn; + } + break; + case SLAPI_OPERATION_AUTHTYPE: if (pblock->pb_op != NULL) { @@ -2676,10 +2728,31 @@ slapi_pblock_set( Slapi_PBlock *pblock, int arg, void *value ) case SLAPI_TARGET_ADDRESS: PR_ASSERT (PR_FALSE); /* can't do this */ break; - case SLAPI_TARGET_DN: + case SLAPI_TARGET_DN: /* DEPRECATED */ + /* slapi_pblock_set(pb, SLAPI_TARGET_DN, val) automatically + * replaces SLAPI_TARGET_SDN. Caller should not free the + * original SLAPI_TARGET_SDN, but the reset one here by getting + * the address using slapi_pblock_get(pb, SLAPI_TARGET_SDN, &sdn). */ if(pblock->pb_op!=NULL) { - pblock->pb_op->o_params.target_address.dn = (char *)value; + Slapi_DN *sdn = pblock->pb_op->o_params.target_address.sdn; + slapi_sdn_free(&sdn); + pblock->pb_op->o_params.target_address.sdn = + slapi_sdn_new_dn_byval((char *)value); + } + else + { + return( -1 ); + } + break; + case SLAPI_TARGET_SDN: + if(pblock->pb_op!=NULL) + { + pblock->pb_op->o_params.target_address.sdn = (Slapi_DN *)value; + } + else + { + return( -1 ); } break; case SLAPI_ORIGINAL_TARGET_DN: @@ -2830,10 +2903,29 @@ slapi_pblock_set( Slapi_PBlock *pblock, int arg, void *value ) pblock->pb_op->o_params.p.p_modrdn.modrdn_deloldrdn = *((int *) value); } break; - case SLAPI_MODRDN_NEWSUPERIOR: + case SLAPI_MODRDN_NEWSUPERIOR: /* DEPRECATED */ + if(pblock->pb_op!=NULL) + { + Slapi_DN *sdn = + pblock->pb_op->o_params.p.p_modrdn.modrdn_newsuperior_address.sdn; + slapi_sdn_free(&sdn); + pblock->pb_op->o_params.p.p_modrdn.modrdn_newsuperior_address.sdn = + slapi_sdn_new_dn_byval((char *)value); + } + else + { + return -1; + } + break; + case SLAPI_MODRDN_NEWSUPERIOR_SDN: if(pblock->pb_op!=NULL) { - pblock->pb_op->o_params.p.p_modrdn.modrdn_newsuperior_address.dn = (char *) value; + pblock->pb_op->o_params.p.p_modrdn.modrdn_newsuperior_address.sdn = + (Slapi_DN *) value; + } + else + { + return -1; } break; case SLAPI_MODRDN_PARENT_ENTRY: @@ -3456,9 +3548,7 @@ bind_credentials_set_nolock( Connection *conn, char *authtype, char *normdn, if ( conn->c_dn != NULL ) { if ( bind_target_entry == NULL ) { - Slapi_DN *sdn; - - sdn = slapi_sdn_new_dn_byref( conn->c_dn ); /* set */ + Slapi_DN *sdn = slapi_sdn_new_normdn_byref( conn->c_dn ); reslimit_update_from_dn( conn, sdn ); slapi_sdn_free( &sdn ); } else { @@ -3466,11 +3556,9 @@ bind_credentials_set_nolock( Connection *conn, char *authtype, char *normdn, } } else { char *anon_dn = config_get_anon_limits_dn(); - Slapi_DN *anon_sdn = NULL; - /* If an anonymous limits dn is set, use it to set the limits. */ if (anon_dn && (strlen(anon_dn) > 0)) { - anon_sdn = slapi_sdn_new_dn_byref( anon_dn ); + Slapi_DN *anon_sdn = slapi_sdn_new_normdn_byref( anon_dn ); reslimit_update_from_dn( conn, anon_sdn ); slapi_sdn_free( &anon_sdn ); } diff --git a/ldap/servers/slapd/plugin.c b/ldap/servers/slapd/plugin.c index 19d6d38..52b560f 100644 --- a/ldap/servers/slapd/plugin.c +++ b/ldap/servers/slapd/plugin.c @@ -180,6 +180,7 @@ add_plugin_entries() slapi_add_entry_internal_set_pb(&newpb, ep->e, NULL, ep->plugin, plugin_actions); slapi_pblock_set(&newpb, SLAPI_TARGET_DN, (void*)slapi_entry_get_dn_const(ep->e)); + slapi_pblock_set(&newpb, SLAPI_TARGET_SDN, (void*)slapi_entry_get_sdn_const(ep->e)); slapi_add_internal_pb(&newpb); deleteep = ep; ep = ep->next; @@ -269,16 +270,13 @@ slapi_register_plugin_ext( int ii = 0; int rc = 0; Slapi_Entry *e = NULL; - char *dn = slapi_create_dn_string("cn=%s,%s", name, PLUGIN_BASE_DN); - if (NULL == dn) { - slapi_log_error(SLAPI_LOG_FATAL, NULL, - "slapi_register_plugin_ext: " - "failed to create plugin dn (plugin name: %s)\n", name); - return 1; - } + char *dn = slapi_ch_smprintf("cn=%s,%s", name, PLUGIN_BASE_DN); + Slapi_DN *sdn = slapi_sdn_new_dn_passin(dn); + e = slapi_entry_alloc(); /* this function consumes dn */ - slapi_entry_init(e, dn, NULL); + slapi_entry_init_ext(e, sdn, NULL); + slapi_sdn_free(&sdn);
slapi_entry_attr_set_charptr(e, "cn", name); slapi_entry_attr_set_charptr(e, ATTR_PLUGIN_TYPE, plugintype); @@ -520,9 +518,6 @@ plugin_extended_op_oid2string( const char *oid ) } break; } - if ( p->plg_exoids[i] != NULL ) { - break; - } } } } @@ -991,30 +986,30 @@ plugin_dependency_startall(int argc, char** argv, char *errmsg, int operation)
if(plugin_entry) { - /* - * Pass the plugin DN in SLAPI_TARGET_DN and the plugin entry - * in SLAPI_ADD_ENTRY. For this to actually work, we need to - * create an operation and include that in the pblock as well, - * because these two items are stored in the operation parameters. - */ - /* WARNING: memory leak here - op is only freed by a pblock_done, + /* + * Pass the plugin DN in SLAPI_TARGET_SDN and the plugin entry + * in SLAPI_ADD_ENTRY. For this to actually work, we need to + * create an operation and include that in the pblock as well, + * because these two items are stored in the operation parameters. + */ + /* WARNING: memory leak here - op is only freed by a pblock_done, and this only happens below if the plugin is enabled - a short circuit goto bail may also cause a leak - however, since this only happens a few times at startup, this is not a very serious leak - just after the call to plugin_call_one */ - Operation *op = internal_operation_new(SLAPI_OPERATION_ADD, 0); - slapi_pblock_set(&(config[plugin_index].pb), SLAPI_OPERATION, op); - slapi_pblock_set(&(config[plugin_index].pb), SLAPI_TARGET_DN, - (void*)(slapi_entry_get_dn_const(plugin_entry))); - slapi_pblock_set(&(config[plugin_index].pb), SLAPI_ADD_ENTRY, - plugin_entry ); + Operation *op = internal_operation_new(SLAPI_OPERATION_ADD, 0); + slapi_pblock_set(&(config[plugin_index].pb), SLAPI_OPERATION, op); + slapi_pblock_set(&(config[plugin_index].pb), SLAPI_TARGET_SDN, + (void*)(slapi_entry_get_sdn_const(plugin_entry))); + slapi_pblock_set(&(config[plugin_index].pb), SLAPI_ADD_ENTRY, + plugin_entry );
/* Pass the plugin alternate config area DN in SLAPI_PLUGIN_CONFIG_AREA. */ value = slapi_entry_attr_get_charptr(plugin_entry, ATTR_PLUGIN_CONFIG_AREA); if(value) { - config[plugin_index].config_area = value; - value = NULL; + config[plugin_index].config_area = value; + value = NULL; slapi_pblock_set(&(config[plugin_index].pb), SLAPI_PLUGIN_CONFIG_AREA, config[plugin_index].config_area); } @@ -1191,7 +1186,7 @@ plugin_dependency_startall(int argc, char** argv, char *errmsg, int operation) newe = slapi_entry_dup( config[plugin_index].e ); slapi_add_entry_internal_set_pb(&newpb, newe, NULL, plugin_get_default_component_id(), plugin_actions); - slapi_pblock_set(&newpb, SLAPI_TARGET_DN, (void*)slapi_entry_get_dn_const(newe)); + slapi_pblock_set(&newpb, SLAPI_TARGET_SDN, (void*)slapi_entry_get_sdn_const(newe)); slapi_add_internal_pb(&newpb); pblock_done(&newpb); config[plugin_index].entry_created = 1; @@ -1440,17 +1435,17 @@ plugin_call_func (struct slapdplugin *list, int operation, Slapi_PBlock *pb, int int count= 0; for (; list != NULL; list = list->plg_next) { - IFP func = NULL; + IFP func = NULL; - slapi_pblock_set (pb, SLAPI_PLUGIN, list); - set_db_default_result_handlers (pb); /* JCM: What's this do? Is it needed here? */ - if (slapi_pblock_get (pb, operation, &func) == 0 && func != NULL && + slapi_pblock_set (pb, SLAPI_PLUGIN, list); + set_db_default_result_handlers (pb); /* JCM: What's this do? Is it needed here? */ + if (slapi_pblock_get (pb, operation, &func) == 0 && func != NULL && plugin_invoke_plugin_pb (list, operation, pb)) { char *n= list->plg_name; LDAPDebug( LDAP_DEBUG_TRACE, "Calling plugin '%s' #%d type %d\n", (n==NULL?"noname":n), count, operation ); /* counters_to_errors_log("before plugin call"); */ - if (( rc = func (pb)) != 0 ) + if (( rc = func (pb)) != 0 ) { if (SLAPI_PLUGIN_PREOPERATION == list->plg_type || SLAPI_PLUGIN_INTERNAL_PREOPERATION == list->plg_type || @@ -1471,16 +1466,16 @@ plugin_call_func (struct slapdplugin *list, int operation, Slapi_PBlock *pb, int /* OR the result into the return value for be pre/postops */ return_value |= rc; } - } + } /* counters_to_errors_log("after plugin call"); */ - } + }
count++;
if(call_one) break; - } - return( return_value ); + } + return( return_value ); }
int @@ -1574,9 +1569,9 @@ ldapi_init_extended_ops( void )
slapi_rwlock_wrlock(extended_ops_lock); charray_add(&supported_extended_ops, - slapi_ch_strdup(EXTOP_BULK_IMPORT_START_OID)); + slapi_ch_strdup(EXTOP_BULK_IMPORT_START_OID)); charray_add(&supported_extended_ops, - slapi_ch_strdup(EXTOP_BULK_IMPORT_DONE_OID)); + slapi_ch_strdup(EXTOP_BULK_IMPORT_DONE_OID)); /* add future supported extops here... */ slapi_rwlock_unlock(extended_ops_lock); } @@ -2147,7 +2142,9 @@ plugin_setup(Slapi_Entry *plugin_entry, struct slapi_componentid *group, } else { - plugin->plg_name = value; /* plugin owns value's memory now, don't free */ + /* plg_name is normalized once here */ + plugin->plg_name = slapi_create_rdn_value("%s", value); + slapi_ch_free((void**)&value); }
if (!(value = slapi_entry_attr_get_charptr(plugin_entry, ATTR_PLUGIN_PRECEDENCE))) @@ -2546,7 +2543,7 @@ plugin_invoke_plugin_sdn (struct slapdplugin *plugin, int operation, Slapi_PBloc char* plugin_get_dn (const struct slapdplugin *plugin) { char *plugindn = NULL; - char *pattern = "cn=%s," PLUGIN_BASE_DN; + char *pattern = "cn=%s," PLUGIN_BASE_DN; /* cn=plugins,cn=config */
if (plugin == NULL) /* old plugin that does not pass identity - use default */ plugin = &global_default_plg; @@ -2554,7 +2551,8 @@ char* plugin_get_dn (const struct slapdplugin *plugin) if (plugin->plg_name == NULL) return NULL;
- plugindn = slapi_create_dn_string(pattern, plugin->plg_name); + /* plg_name is normalized in plugin_setup. So, we can use smprintf */ + plugindn = slapi_ch_smprintf(pattern, plugin->plg_name); if (NULL == plugindn) { slapi_log_error(SLAPI_LOG_FATAL, NULL, "plugin_get_dn: failed to create plugin dn " diff --git a/ldap/servers/slapd/plugin_acl.c b/ldap/servers/slapd/plugin_acl.c index 2dd0f71..24dcc76 100644 --- a/ldap/servers/slapd/plugin_acl.c +++ b/ldap/servers/slapd/plugin_acl.c @@ -138,12 +138,12 @@ plugin_call_acl_mods_update ( Slapi_PBlock *pb, int optype ) int rc = 0; void *change = NULL; Slapi_Entry *te = NULL; - Slapi_DN sdn; + Slapi_DN *sdn = NULL; Operation *operation;
slapi_pblock_get (pb, SLAPI_OPERATION, &operation);
- (void)slapi_pblock_get( pb, SLAPI_TARGET_DN, &dn ); + (void)slapi_pblock_get( pb, SLAPI_TARGET_SDN, &sdn );
switch ( optype ) { case SLAPI_OPERATION_MODIFY: @@ -154,24 +154,29 @@ plugin_call_acl_mods_update ( Slapi_PBlock *pb, int optype ) te = (Slapi_Entry *)change; if(!slapi_sdn_isempty(slapi_entry_get_sdn(te))) { - dn= (char*)slapi_sdn_get_ndn(slapi_entry_get_sdn(te)); /* jcm - Had to cast away const */ + sdn = slapi_entry_get_sdn(te); } break; case SLAPI_OPERATION_MODRDN: (void)slapi_pblock_get( pb, SLAPI_MODRDN_NEWRDN, &change ); break; - } + } - slapi_sdn_init_dn_byref (&sdn, dn); + if (NULL == sdn) { + LDAPDebug0Args ( LDAP_DEBUG_ANY, + "plugin_call_acl_mods_update: Null target DN\n" ); + return LDAP_INVALID_DN_SYNTAX; + } + /* call the global plugins first and then the backend specific */ + dn = (char*)slapi_sdn_get_ndn(sdn); /* jcm - Had to cast away const */ for ( p = get_plugin_list(PLUGIN_LIST_ACL); p != NULL; p = p->plg_next ) { - if (plugin_invoke_plugin_sdn (p, SLAPI_PLUGIN_ACL_MODS_UPDATE, pb, &sdn)){ + if (plugin_invoke_plugin_sdn(p, SLAPI_PLUGIN_ACL_MODS_UPDATE, pb, sdn)){ rc = (*p->plg_acl_mods_update)(pb, optype, dn, change ); if ( rc != LDAP_SUCCESS ) break; } }
- slapi_sdn_done (&sdn); return rc; }
diff --git a/ldap/servers/slapd/plugin_internal_op.c b/ldap/servers/slapd/plugin_internal_op.c index c8e6000..563bc46 100644 --- a/ldap/servers/slapd/plugin_internal_op.c +++ b/ldap/servers/slapd/plugin_internal_op.c @@ -282,21 +282,58 @@ int slapi_seq_internal_callback_pb (Slapi_PBlock *pb, void *callback_data, plugi return (seq_internal_callback_pb (pb, callback_data, res_callback, srch_callback, ref_callback)); }
-void slapi_search_internal_set_pb (Slapi_PBlock *pb, const char *base, int scope, const char *filter, char **attrs, - int attrsonly, LDAPControl **controls, const char *uniqueid, - Slapi_ComponentId *plugin_identity, int operation_flags) +void +slapi_search_internal_set_pb (Slapi_PBlock *pb, const char *base, + int scope, const char *filter, char **attrs, + int attrsonly, LDAPControl **controls, + const char *uniqueid, + Slapi_ComponentId *plugin_identity, + int operation_flags) { Operation *op; if (pb == NULL || base == NULL) { - slapi_log_error(SLAPI_LOG_FATAL, NULL, - "slapi_search_internal_set_pb: NULL parameter\n"); + slapi_log_error(SLAPI_LOG_FATAL, NULL, + "slapi_search_internal_set_pb: NULL parameter\n"); return; }
- op= internal_operation_new(SLAPI_OPERATION_SEARCH,operation_flags); + op= internal_operation_new(SLAPI_OPERATION_SEARCH,operation_flags); + slapi_pblock_set(pb, SLAPI_OPERATION, op); + slapi_pblock_set(pb, SLAPI_ORIGINAL_TARGET_DN, (void *)base); + slapi_pblock_set(pb, SLAPI_SEARCH_SCOPE, &scope); + slapi_pblock_set(pb, SLAPI_SEARCH_STRFILTER, (void*)filter); + slapi_pblock_set(pb, SLAPI_CONTROLS_ARG, controls); + slapi_pblock_set(pb, SLAPI_SEARCH_ATTRS, attrs); + slapi_pblock_set(pb, SLAPI_SEARCH_ATTRSONLY, &attrsonly); + if (uniqueid) + { + slapi_pblock_set(pb, SLAPI_TARGET_UNIQUEID, (void*)uniqueid); + } + slapi_pblock_set(pb, SLAPI_PLUGIN_IDENTITY, (void*)plugin_identity); +} + +void +slapi_search_internal_set_pb_ext (Slapi_PBlock *pb, Slapi_DN *sdn, + int scope, const char *filter, char **attrs, + int attrsonly, LDAPControl **controls, + const char *uniqueid, + Slapi_ComponentId *plugin_identity, + int operation_flags) +{ + Operation *op; + if (pb == NULL || sdn == NULL) + { + slapi_log_error(SLAPI_LOG_FATAL, NULL, + "slapi_search_internal_set_pb: NULL parameter\n"); + return; + } + + op= internal_operation_new(SLAPI_OPERATION_SEARCH,operation_flags); slapi_pblock_set(pb, SLAPI_OPERATION, op); - slapi_pblock_set(pb, SLAPI_SEARCH_TARGET, (void*)base); + slapi_pblock_set(pb, SLAPI_ORIGINAL_TARGET_DN, + (void *)slapi_sdn_get_udn(sdn)); + slapi_pblock_set(pb, SLAPI_TARGET_SDN, (void *)sdn); slapi_pblock_set(pb, SLAPI_SEARCH_SCOPE, &scope); slapi_pblock_set(pb, SLAPI_SEARCH_STRFILTER, (void*)filter); slapi_pblock_set(pb, SLAPI_CONTROLS_ARG, controls); @@ -323,7 +360,7 @@ void slapi_seq_internal_set_pb(Slapi_PBlock *pb, char *base, int type, char *att
op= internal_operation_new(SLAPI_OPERATION_SEARCH,operation_flags); slapi_pblock_set(pb, SLAPI_OPERATION, op); - slapi_pblock_set(pb, SLAPI_SEARCH_TARGET, base); + slapi_pblock_set(pb, SLAPI_ORIGINAL_TARGET_DN, (void *)base ); slapi_pblock_set(pb, SLAPI_SEQ_TYPE, &type); slapi_pblock_set(pb, SLAPI_SEQ_ATTRNAME, attrname); slapi_pblock_set(pb, SLAPI_SEQ_VAL, val); @@ -343,19 +380,22 @@ static int seq_internal_callback_pb (Slapi_PBlock *pb, void *callback_data, Operation *op; struct callback_fn_ptrs callback_handler_data; Slapi_Backend *be; - Slapi_DN sdn; char *base; char *attrname, *val; + Slapi_DN *sdn = NULL;
- slapi_pblock_get(pb, SLAPI_SEARCH_TARGET, &base); + slapi_pblock_get(pb, SLAPI_ORIGINAL_TARGET_DN, (void *)&base ); slapi_pblock_get(pb, SLAPI_CONTROLS_ARG, &controls);
- if (base == NULL) { - slapi_sdn_init_dn_byval(&sdn,""); - } else { - slapi_sdn_init_dn_byval(&sdn, base); - } - be = slapi_be_select(&sdn); + if (base == NULL) { + sdn = slapi_sdn_new_dn_byval(""); + } else { + sdn = slapi_sdn_new_dn_byref(base); + } + + slapi_pblock_set(pb, SLAPI_SEARCH_TARGET_SDN, sdn); + + be = slapi_be_select(sdn);
callback_handler_data.p_res_callback = prc; callback_handler_data.p_srch_entry_callback = psec; @@ -369,8 +409,7 @@ static int seq_internal_callback_pb (Slapi_PBlock *pb, void *callback_data, op->o_search_referral_handler = internal_ref_entry_callback; /* set target specification of the operation used to decide which plugins are called for the operation */ - operation_set_target_spec (op, &sdn); - + operation_set_target_spec (op, sdn);
/* Normalize the attribute type and value */ slapi_pblock_get (pb, SLAPI_SEQ_ATTRNAME, &attrname); @@ -396,14 +435,16 @@ static int seq_internal_callback_pb (Slapi_PBlock *pb, void *callback_data, } else { - send_ldap_result(pb, LDAP_UNWILLING_TO_PERFORM, NULL, "Function not implemented", 0, NULL); + send_ldap_result(pb, LDAP_UNWILLING_TO_PERFORM, NULL, "Function not implemented", 0, NULL); rc = 0; }
- slapi_ch_free((void **) &attrname); - slapi_ch_free((void **) &val); - - slapi_sdn_done(&sdn); + slapi_ch_free_string(&attrname); + slapi_ch_free_string(&val); + /* slapi_pblock_get(pb, SLAPI_SEARCH_TARGET, &normbase); */ + slapi_pblock_get(pb, SLAPI_SEARCH_TARGET_SDN, &sdn); + slapi_sdn_free(&sdn); + slapi_pblock_set(pb, SLAPI_SEARCH_TARGET_SDN, NULL);
return rc; } @@ -675,10 +716,11 @@ static int search_internal_pb (Slapi_PBlock *pb) return 0; }
-static int search_internal_callback_pb (Slapi_PBlock *pb, void *callback_data, - plugin_result_callback prc, - plugin_search_entry_callback psec, - plugin_referral_entry_callback prec) +static int +search_internal_callback_pb (Slapi_PBlock *pb, void *callback_data, + plugin_result_callback prc, + plugin_search_entry_callback psec, + plugin_referral_entry_callback prec) { LDAPControl **controls; Operation *op; @@ -689,8 +731,6 @@ static int search_internal_callback_pb (Slapi_PBlock *pb, void *callback_data, char *ifstr; int opresult; int rc = 0; - char *original_base = 0; - char *new_base = 0;
PR_ASSERT (pb);
@@ -755,12 +795,8 @@ static int search_internal_callback_pb (Slapi_PBlock *pb, void *callback_data, * memory so we need to keep track of * changed base search strings */ - slapi_pblock_get(pb, SLAPI_SEARCH_TARGET, &original_base); - slapi_pblock_set(pb, SLAPI_ORIGINAL_TARGET_DN, slapi_ch_strdup(original_base)); - op_shared_search (pb, 1);
- slapi_pblock_get(pb, SLAPI_SEARCH_TARGET, &new_base); slapi_pblock_get(pb, SLAPI_SEARCH_FILTER, &filter);
done: @@ -770,24 +806,17 @@ done: slapi_filter_free(filter, 1 /* recurse */); }
- if(original_base != new_base) - slapi_ch_free_string(&new_base); - - /* we strdup'd this above - need to free */ - slapi_pblock_get(pb, SLAPI_ORIGINAL_TARGET_DN, &original_base); - slapi_ch_free_string(&original_base); - return(rc); }
/* allow/disallow operation based of the plugin configuration */ PRBool allow_operation (Slapi_PBlock *pb) { - char *dn = NULL; struct slapdplugin *plugin = NULL; + Slapi_DN *sdnp = NULL; Slapi_DN sdn; PRBool allow; - struct slapi_componentid * cid=NULL; + struct slapi_componentid * cid=NULL;
PR_ASSERT (pb); @@ -805,17 +834,17 @@ PRBool allow_operation (Slapi_PBlock *pb) return PR_FALSE; }
- slapi_pblock_get (pb, SLAPI_TARGET_DN, &dn); - if (dn == NULL) { - slapi_sdn_init_dn_byval(&sdn,""); - } else { - slapi_sdn_init_dn_byval(&sdn, dn); - } + slapi_sdn_init(&sdn); + slapi_pblock_get (pb, SLAPI_TARGET_SDN, &sdnp); + if (NULL == sdnp) { + slapi_sdn_init_dn_byval(&sdn,""); + sdnp = &sdn; + }
- allow = plugin_allow_internal_op (&sdn, plugin); - - slapi_sdn_done (&sdn); + allow = plugin_allow_internal_op (sdnp, plugin);
+ slapi_sdn_done(&sdn); + return allow; }
diff --git a/ldap/servers/slapd/plugin_syntax.c b/ldap/servers/slapd/plugin_syntax.c index 2e357b4..adfda4a 100644 --- a/ldap/servers/slapd/plugin_syntax.c +++ b/ldap/servers/slapd/plugin_syntax.c @@ -282,7 +282,7 @@ plugin_call_syntax_filter_sub_sv( */ int slapi_dn_syntax_check( - Slapi_PBlock *pb, char *dn, int override + Slapi_PBlock *pb, const char *dn, int override ) { int ret = 0; @@ -312,7 +312,7 @@ slapi_dn_syntax_check( if (dn_plugin && dn_plugin->plg_syntax_validate != NULL) { /* Create a berval to pass to the validate function. */ if (dn) { - dn_bval.bv_val = dn; + dn_bval.bv_val = (char *)dn; dn_bval.bv_len = strlen(dn);
/* Validate the value. */ @@ -459,7 +459,8 @@ slapi_mods_syntax_check( char errtext[ BUFSIZ ]; char *errp = &errtext[0]; size_t err_remaining = sizeof(errtext); - char *dn = NULL; + const char *dn = NULL; + Slapi_DN *sdn = NULL; LDAPMod *mod = NULL;
if (mods == NULL) { @@ -469,7 +470,8 @@ slapi_mods_syntax_check(
if (pb != NULL) { slapi_pblock_get(pb, SLAPI_IS_REPLICATED_OPERATION, &is_replicated_operation); - slapi_pblock_get(pb, SLAPI_TARGET_DN, &dn); + slapi_pblock_get(pb, SLAPI_TARGET_SDN, &sdn); + dn = slapi_sdn_get_dn(sdn); }
/* If syntax checking and logging are off, or if this is a diff --git a/ldap/servers/slapd/proto-slap.h b/ldap/servers/slapd/proto-slap.h index 0ff2296..69a7554 100644 --- a/ldap/servers/slapd/proto-slap.h +++ b/ldap/servers/slapd/proto-slap.h @@ -862,7 +862,7 @@ void pw_add_allowchange_aci(Slapi_Entry *e, int pw_prohibit_change); * pw_retry.c */ int update_pw_retry ( Slapi_PBlock *pb ); -void pw_apply_mods(const char *dn, Slapi_Mods *mods); +void pw_apply_mods(const Slapi_DN *sdn, Slapi_Mods *mods); void pw_set_componentID(struct slapi_componentid * cid); struct slapi_componentid * pw_get_componentID();
diff --git a/ldap/servers/slapd/proxyauth.c b/ldap/servers/slapd/proxyauth.c index 9dbcac8..2230a31 100644 --- a/ldap/servers/slapd/proxyauth.c +++ b/ldap/servers/slapd/proxyauth.c @@ -87,9 +87,7 @@ parse_LDAPProxyAuth(struct berval *spec_ber, int version, char **errtextp, LDAPProxyAuth *spec = NULL; BerElement *ber = NULL; char *errstring = "unable to parse proxied authorization control"; - int rc = 0; - char *normed = NULL; - size_t dnlen = 0; + Slapi_DN *sdn = NULL;
BEGIN ber_tag_t tag; @@ -143,14 +141,11 @@ parse_LDAPProxyAuth(struct berval *spec_ber, int version, char **errtextp, }
lderr = LDAP_SUCCESS; /* got it! */ - rc = slapi_dn_normalize_ext(spec->auth_dn, 0, &normed, &dnlen); - if (rc < 0) { + sdn = slapi_sdn_new_dn_passin(spec->auth_dn); + spec->auth_dn = slapi_ch_strdup(slapi_sdn_get_ndn(sdn)); + slapi_sdn_free(&sdn); + if (NULL == spec->auth_dn) { lderr = LDAP_INVALID_SYNTAX; - } else if (rc == 0) { /* spec->auth_dn is passed in; not terminated */ - *(normed + dnlen) = '\0'; - } else { - slapi_ch_free_string(&spec->auth_dn); - spec->auth_dn = normed; } END
diff --git a/ldap/servers/slapd/psearch.c b/ldap/servers/slapd/psearch.c index c19d34f..9fc1172 100644 --- a/ldap/servers/slapd/psearch.c +++ b/ldap/servers/slapd/psearch.c @@ -291,6 +291,7 @@ ps_send_results( void *arg ) PSEQNode *peq, *peqnext; struct slapi_filter *filter = 0; char *base = NULL; + Slapi_DN *sdn = NULL; char *fstr = NULL; char **pbattrs = NULL; int conn_acq_flag = 0; @@ -392,16 +393,16 @@ ps_send_results( void *arg ) plugin_call_plugins( ps->ps_pblock , SLAPI_PLUGIN_POST_SEARCH_FN );
/* free things from the pblock that were not free'd in do_search() */ - /* Free SLAPI_SEARCH_* before deleting op since those are held by op */ - slapi_pblock_get( ps->ps_pblock, SLAPI_SEARCH_TARGET, &base ); - slapi_pblock_set( ps->ps_pblock, SLAPI_SEARCH_TARGET, NULL ); - slapi_ch_free_string(&base); - /* we strdup'd this in search.c - need to free */ slapi_pblock_get( ps->ps_pblock, SLAPI_ORIGINAL_TARGET_DN, &base ); slapi_pblock_set( ps->ps_pblock, SLAPI_ORIGINAL_TARGET_DN, NULL ); slapi_ch_free_string(&base);
+ /* Free SLAPI_SEARCH_* before deleting op since those are held by op */ + slapi_pblock_get( ps->ps_pblock, SLAPI_SEARCH_TARGET_SDN, &sdn ); + slapi_pblock_set( ps->ps_pblock, SLAPI_SEARCH_TARGET_SDN, NULL ); + slapi_sdn_free(&sdn); + slapi_pblock_get( ps->ps_pblock, SLAPI_SEARCH_STRFILTER, &fstr ); slapi_pblock_set( ps->ps_pblock, SLAPI_SEARCH_STRFILTER, NULL ); slapi_ch_free_string(&fstr); @@ -525,8 +526,8 @@ ps_service_persistent_searches( Slapi_Entry *e, Slapi_Entry *eprev, ber_int_t ch ber_int_t chgnum ) { LDAPControl *ctrl = NULL; - PSearch *ps = NULL; - PSEQNode *pe = NULL; + PSearch *ps = NULL; + PSEQNode *pe = NULL; int matched = 0; const char *edn;
@@ -534,24 +535,24 @@ ps_service_persistent_searches( Slapi_Entry *e, Slapi_Entry *eprev, ber_int_t ch return; }
- if ( NULL == e ) { + if ( NULL == e ) { /* For now, some backends such as the chaining backend do not provide a post-op entry */ return; - } + }
- PSL_LOCK_READ(); + PSL_LOCK_READ(); edn = slapi_entry_get_dn_const(e);
for ( ps = psearch_list ? psearch_list->pl_head : NULL; NULL != ps; ps = ps->ps_next ) { - Slapi_DN base; - Slapi_Filter *f; - char *basedn; - int scope; + char *origbase = NULL; + Slapi_DN *base = NULL; + Slapi_Filter *f; + int scope;
/* Skip the node that doesn't meet the changetype, * or is unable to use the change in ps_send_results() */ - if (( ps->ps_changetypes & chgtype ) == 0 || + if (( ps->ps_changetypes & chgtype ) == 0 || ps->ps_pblock->pb_op == NULL || slapi_op_abandoned( ps->ps_pblock ) ) { continue; @@ -560,14 +561,18 @@ ps_service_persistent_searches( Slapi_Entry *e, Slapi_Entry *eprev, ber_int_t ch slapi_log_error(SLAPI_LOG_CONNS, "Persistent Search", "conn=%" NSPRIu64 " op=%d entry %s with chgtype %d " "matches the ps changetype %d\n", - ps->ps_pblock->pb_conn->c_connid, ps->ps_pblock->pb_op->o_opid, + ps->ps_pblock->pb_conn->c_connid, + ps->ps_pblock->pb_op->o_opid, edn, chgtype, ps->ps_changetypes);
slapi_pblock_get( ps->ps_pblock, SLAPI_SEARCH_FILTER, &f ); - slapi_pblock_get( ps->ps_pblock, SLAPI_SEARCH_TARGET, &basedn ); + slapi_pblock_get( ps->ps_pblock, SLAPI_ORIGINAL_TARGET_DN, &origbase ); + slapi_pblock_get( ps->ps_pblock, SLAPI_SEARCH_TARGET_SDN, &base ); slapi_pblock_get( ps->ps_pblock, SLAPI_SEARCH_SCOPE, &scope ); - slapi_sdn_init_dn_byref(&base,basedn); - + if (NULL == base) { + base = slapi_sdn_new_dn_byref(origbase); + slapi_pblock_set(ps->ps_pblock, SLAPI_SEARCH_TARGET_SDN, base); + }
/* * See if the entry meets the scope and filter criteria. @@ -582,7 +587,7 @@ ps_service_persistent_searches( Slapi_Entry *e, Slapi_Entry *eprev, ber_int_t ch * to the same pblock must be done carefully--there is currently no * generic satisfactory way to do this. */ - if ( slapi_sdn_scope_test( slapi_entry_get_sdn_const(e), &base, scope ) && + if ( slapi_sdn_scope_test( slapi_entry_get_sdn_const(e), base, scope ) && slapi_vattr_filter_test( ps->ps_pblock, e, f, 0 /* verify_access */ ) == 0 ) { PSEQNode *pOldtail;
@@ -601,11 +606,11 @@ ps_service_persistent_searches( Slapi_Entry *e, Slapi_Entry *eprev, ber_int_t ch eprev ? slapi_entry_get_dn_const(eprev) : NULL, &ctrl ); if ( rc != LDAP_SUCCESS ) { - char ebuf[ BUFSIZ ]; + char ebuf[ BUFSIZ ]; LDAPDebug( LDAP_DEBUG_ANY, "ps_service_persistent_searches:" - " unable to create EntryChangeNotification control for" - " entry "%s" -- control won't be sent.\n", - escape_string( slapi_entry_get_dn_const(e), ebuf), 0, 0 ); + " unable to create EntryChangeNotification control for" + " entry "%s" -- control won't be sent.\n", + escape_string( slapi_entry_get_dn_const(e), ebuf), 0, 0 ); } } if ( ctrl ) { @@ -618,29 +623,28 @@ ps_service_persistent_searches( Slapi_Entry *e, Slapi_Entry *eprev, ber_int_t ch pOldtail = ps->ps_eq_tail; ps->ps_eq_tail = pe; if ( NULL == ps->ps_eq_head ) { - ps->ps_eq_head = ps->ps_eq_tail; + ps->ps_eq_head = ps->ps_eq_tail; } else { pOldtail->pe_next = ps->ps_eq_tail; } PR_Unlock( ps->ps_lock ); } - slapi_sdn_done(&base); }
PSL_UNLOCK_READ();
- /* Were there any matches? */ - if ( matched ) { + /* Were there any matches? */ + if ( matched ) { ldap_control_free( ctrl ); /* Turn 'em loose */ ps_wakeup_all(); LDAPDebug( LDAP_DEBUG_TRACE, "ps_service_persistent_searches: enqueued entry " ""%s" on %d persistent search lists\n", slapi_entry_get_dn_const(e), matched, 0 ); - } else { + } else { LDAPDebug( LDAP_DEBUG_TRACE, "ps_service_persistent_searches: entry " ""%s" not enqueued on any persistent search lists\n", slapi_entry_get_dn_const(e), 0, 0 ); - } + }
}
diff --git a/ldap/servers/slapd/pw.c b/ldap/servers/slapd/pw.c index 61d01d9..8138d05 100644 --- a/ldap/servers/slapd/pw.c +++ b/ldap/servers/slapd/pw.c @@ -69,7 +69,7 @@ #define GENERALIZED_TIME_LENGTH 15
static int pw_in_history(Slapi_Value **history_vals, const Slapi_Value *pw_val); -static int update_pw_history( Slapi_PBlock *pb, char *dn, char *old_pw ); +static int update_pw_history( Slapi_PBlock *pb, const Slapi_DN *sdn, char *old_pw ); static int check_trivial_words (Slapi_PBlock *, Slapi_Entry *, Slapi_Value **, char *attrtype, int toklen, Slapi_Mods *smods ); static int pw_boolean_str2value (const char *str); @@ -586,8 +586,9 @@ update_pw_info ( Slapi_PBlock *pb , char *old_pw) { Slapi_Mods smods; char *timestr; time_t pw_exp_date; - time_t cur_time; - char *dn; + time_t cur_time; + const char *dn; + Slapi_DN *sdn = NULL; passwdPolicy *pwpolicy = NULL; int internal_op = 0; Slapi_Operation *operation = NULL; @@ -596,13 +597,14 @@ update_pw_info ( Slapi_PBlock *pb , char *old_pw) { internal_op = slapi_operation_is_flag_set(operation, SLAPI_OP_FLAG_INTERNAL);
cur_time = current_time(); - slapi_pblock_get( pb, SLAPI_TARGET_DN, &dn ); + slapi_pblock_get( pb, SLAPI_TARGET_SDN, &sdn ); + dn = slapi_sdn_get_dn(sdn); pwpolicy = new_passwdPolicy(pb, dn);
/* update passwordHistory */ if ( old_pw != NULL && pwpolicy->pw_history == 1 ) { - update_pw_history(pb, dn, old_pw); + update_pw_history(pb, sdn, old_pw); slapi_ch_free ( (void**)&old_pw ); }
@@ -663,7 +665,7 @@ update_pw_info ( Slapi_PBlock *pb , char *old_pw) { } else if (prev_exp_date == SLAPD_END_TIME) { /* Special entries' passwords never expire */ slapi_ch_free((void**)&prev_exp_date_str); - pw_apply_mods(dn, &smods); + pw_apply_mods(sdn, &smods); slapi_mods_done(&smods); delete_passwdPolicy(&pwpolicy); return 0; @@ -680,7 +682,7 @@ update_pw_info ( Slapi_PBlock *pb , char *old_pw) { */ pw_exp_date = NOT_FIRST_TIME; } else { - pw_apply_mods(dn, &smods); + pw_apply_mods(sdn, &smods); slapi_mods_done(&smods); delete_passwdPolicy(&pwpolicy); return 0; @@ -694,7 +696,7 @@ update_pw_info ( Slapi_PBlock *pb , char *old_pw) { slapi_mods_add_string(&smods, LDAP_MOD_REPLACE, "passwordExpWarned", "0");
- pw_apply_mods(dn, &smods); + pw_apply_mods(sdn, &smods); slapi_mods_done(&smods); if (pb->pb_conn) { /* no conn for internal op */ /* reset c_needpw to 0 */ @@ -1061,9 +1063,9 @@ check_pw_syntax_ext ( Slapi_PBlock *pb, const Slapi_DN *sdn, Slapi_Value **vals,
}
-static -int update_pw_history( Slapi_PBlock *pb, char *dn, char *old_pw ) { - +static int +update_pw_history( Slapi_PBlock *pb, const Slapi_DN *sdn, char *old_pw ) +{ time_t t, old_t, cur_time; int i = 0, oldest = 0; int res; @@ -1076,6 +1078,7 @@ int update_pw_history( Slapi_PBlock *pb, char *dn, char *old_pw ) { char *history_str; char *str; passwdPolicy *pwpolicy = NULL; + const char *dn = slapi_sdn_get_dn(sdn);
pwpolicy = new_passwdPolicy(pb, dn);
@@ -1134,13 +1137,13 @@ int update_pw_history( Slapi_PBlock *pb, char *dn, char *old_pw ) { list_of_mods[1] = NULL;
pblock_init(&mod_pb); - slapi_modify_internal_set_pb(&mod_pb, dn, list_of_mods, NULL, NULL, + slapi_modify_internal_set_pb_ext(&mod_pb, sdn, list_of_mods, NULL, NULL, pw_get_componentID(), 0); slapi_modify_internal_pb(&mod_pb); slapi_pblock_get(&mod_pb, SLAPI_PLUGIN_INTOP_RESULT, &res); if (res != LDAP_SUCCESS){ - LDAPDebug(LDAP_DEBUG_ANY, "WARNING: passwordPolicy modify error %d on entry '%s'\n", - res, dn, 0); + LDAPDebug2Args(LDAP_DEBUG_ANY, + "WARNING: passwordPolicy modify error %d on entry '%s'\n", res, dn); }
pblock_done(&mod_pb); @@ -1253,7 +1256,8 @@ slapi_add_pwd_control ( Slapi_PBlock *pb, char *arg, long time) { }
void -pw_mod_allowchange_aci(int pw_prohibit_change) { +pw_mod_allowchange_aci(int pw_prohibit_change) +{ const Slapi_DN *base; char *values_mod[2]; LDAPMod mod; @@ -1293,7 +1297,8 @@ pw_mod_allowchange_aci(int pw_prohibit_change) { pblock_init (&pb); values_mod[0] = DENY_PW_CHANGE_ACI; values_mod[1] = NULL; - slapi_modify_internal_set_pb(&pb, slapi_sdn_get_dn(base), mods, NULL, NULL, pw_get_componentID(), 0); + slapi_modify_internal_set_pb_ext(&pb, base, mods, NULL, NULL, + pw_get_componentID(), 0); slapi_modify_internal_pb(&pb); slapi_pblock_get(&pb, SLAPI_PLUGIN_INTOP_RESULT, &rc); if (rc == LDAP_SUCCESS){ @@ -1302,7 +1307,7 @@ pw_mod_allowchange_aci(int pw_prohibit_change) { ** successfully, let's update the ** in-memory acl list */ - slapi_pblock_set(&pb, SLAPI_TARGET_DN, (char*)slapi_sdn_get_dn(base) ); /* jcm: cast away const */ + slapi_pblock_set(&pb, SLAPI_TARGET_SDN, (void *)base); plugin_call_acl_mods_update (&pb, LDAP_REQ_MODIFY ); } pblock_done(&pb); @@ -1320,7 +1325,7 @@ add_password_attrs( Slapi_PBlock *pb, Operation *op, Slapi_Entry *e ) struct berval *bvals[2]; Slapi_Attr **a, **next; passwdPolicy *pwpolicy = NULL; - char *dn = slapi_entry_get_ndn(e); + const char *dn = slapi_entry_get_ndn(e); int has_allowchangetime = 0, has_expirationtime = 0; time_t existing_exptime = 0;
diff --git a/ldap/servers/slapd/pw_mgmt.c b/ldap/servers/slapd/pw_mgmt.c index aa76e03..8d99879 100644 --- a/ldap/servers/slapd/pw_mgmt.c +++ b/ldap/servers/slapd/pw_mgmt.c @@ -63,11 +63,13 @@ need_new_pw( Slapi_PBlock *pb, long *t, Slapi_Entry *e, int pwresponse_req ) char *passwordExpirationTime; char *timestring; char *dn; + const Slapi_DN *sdn; passwdPolicy *pwpolicy = NULL; int pwdGraceUserTime = 0; char graceUserTime[8];
slapi_mods_init (&smods, 0); + sdn = slapi_entry_get_sdn_const( e ); dn = slapi_entry_get_ndn( e ); pwpolicy = new_passwdPolicy(pb, dn);
@@ -100,9 +102,9 @@ need_new_pw( Slapi_PBlock *pb, long *t, Slapi_Entry *e, int pwresponse_req ) slapi_ch_free((void **)×tring); slapi_mods_add_string(&smods, LDAP_MOD_REPLACE, "passwordExpWarned", "0"); - pw_apply_mods(dn, &smods); + pw_apply_mods(sdn, &smods); } else if (pwpolicy->pw_lockout == 1) { - pw_apply_mods(dn, &smods); + pw_apply_mods(sdn, &smods); } slapi_mods_done(&smods); delete_passwdPolicy(&pwpolicy); @@ -148,7 +150,7 @@ skip: } slapi_add_pwd_control ( pb, LDAP_CONTROL_PWEXPIRED, 0); } - pw_apply_mods(dn, &smods); + pw_apply_mods(sdn, &smods); slapi_mods_done(&smods); delete_passwdPolicy(&pwpolicy); return ( 0 ); @@ -171,7 +173,7 @@ skip: sprintf ( graceUserTime, "%d", pwdGraceUserTime ); slapi_mods_add_string(&smods, LDAP_MOD_REPLACE, "passwordGraceUserTime", graceUserTime); - pw_apply_mods(dn, &smods); + pw_apply_mods(sdn, &smods); slapi_mods_done(&smods); if (pwresponse_req) { /* check for "changeafterreset" condition */ @@ -214,7 +216,7 @@ skip: pb->pb_op->o_opid, SLAPD_DISCONNECT_UNBIND, 0); } /* Apply current modifications */ - pw_apply_mods(dn, &smods); + pw_apply_mods(sdn, &smods); slapi_mods_done(&smods); delete_passwdPolicy(&pwpolicy); return (-1); @@ -261,7 +263,7 @@ skip: *t = (long)diff_t; /* jcm: had to cast double to long */ } - pw_apply_mods(dn, &smods); + pw_apply_mods(sdn, &smods); slapi_mods_done(&smods); if (pwresponse_req) { /* check for "changeafterreset" condition */ @@ -281,7 +283,7 @@ skip: return (2); }
- pw_apply_mods(dn, &smods); + pw_apply_mods(sdn, &smods); slapi_mods_done(&smods); /* Leftover from "changeafterreset" condition */ if (pb->pb_conn->c_needpw == 1) { diff --git a/ldap/servers/slapd/pw_retry.c b/ldap/servers/slapd/pw_retry.c index 573046f..9c801ad 100644 --- a/ldap/servers/slapd/pw_retry.c +++ b/ldap/servers/slapd/pw_retry.c @@ -124,13 +124,15 @@ int update_pw_retry ( Slapi_PBlock *pb )
static void set_retry_cnt_and_time ( Slapi_PBlock *pb, int count, time_t cur_time ) { - char *dn; + const char *dn = NULL; + Slapi_DN *sdn = NULL; Slapi_Mods smods; time_t reset_time; char *timestr; passwdPolicy *pwpolicy = NULL;
- slapi_pblock_get( pb, SLAPI_TARGET_DN, &dn ); + slapi_pblock_get( pb, SLAPI_TARGET_SDN, &sdn ); + dn = slapi_sdn_get_dn(sdn); pwpolicy = new_passwdPolicy(pb, dn);
slapi_mods_init(&smods, 0); @@ -144,7 +146,7 @@ void set_retry_cnt_and_time ( Slapi_PBlock *pb, int count, time_t cur_time ) {
set_retry_cnt_mods(pb, &smods, count); - pw_apply_mods(dn, &smods); + pw_apply_mods(sdn, &smods); slapi_mods_done(&smods); delete_passwdPolicy(&pwpolicy); } @@ -154,10 +156,12 @@ void set_retry_cnt_mods(Slapi_PBlock *pb, Slapi_Mods *smods, int count) char *timestr; time_t unlock_time; char retry_cnt[8]; /* 1-65535 */ - char *dn = NULL; + const char *dn = NULL; + Slapi_DN *sdn = NULL; passwdPolicy *pwpolicy = NULL;
- slapi_pblock_get( pb, SLAPI_TARGET_DN, &dn ); + slapi_pblock_get( pb, SLAPI_TARGET_SDN, &sdn ); + dn = slapi_sdn_get_dn(sdn); pwpolicy = new_passwdPolicy(pb, dn);
if (smods) { @@ -185,14 +189,15 @@ void set_retry_cnt_mods(Slapi_PBlock *pb, Slapi_Mods *smods, int count) }
static -void set_retry_cnt ( Slapi_PBlock *pb, int count) { - char *dn; +void set_retry_cnt ( Slapi_PBlock *pb, int count) +{ + Slapi_DN *sdn = NULL; Slapi_Mods smods; - slapi_pblock_get( pb, SLAPI_TARGET_DN, &dn ); + slapi_pblock_get( pb, SLAPI_TARGET_SDN, &sdn ); slapi_mods_init(&smods, 0); set_retry_cnt_mods(pb, &smods, count); - pw_apply_mods(dn, &smods); + pw_apply_mods(sdn, &smods); slapi_mods_done(&smods); }
@@ -201,12 +206,13 @@ Slapi_Entry *get_entry ( Slapi_PBlock *pb, const char *dn) { int search_result = 0; Slapi_Entry *retentry = NULL; - Slapi_DN sdn; + Slapi_DN *target_sdn = NULL; + Slapi_DN sdn; + + slapi_pblock_get( pb, SLAPI_TARGET_SDN, &target_sdn );
if ((dn == NULL) && pb) { - char *t; - slapi_pblock_get( pb, SLAPI_TARGET_DN, &t ); - dn= t; + dn = slapi_sdn_get_dn(target_sdn); }
if (dn == NULL) { @@ -216,7 +222,14 @@ Slapi_Entry *get_entry ( Slapi_PBlock *pb, const char *dn)
slapi_sdn_init_dn_byref(&sdn, dn);
- if ((search_result = slapi_search_internal_get_entry(&sdn, NULL, &retentry, pw_get_componentID())) != LDAP_SUCCESS){ + if (slapi_sdn_compare(&sdn, target_sdn)) { /* does not match */ + target_sdn = &sdn; + } + + search_result = slapi_search_internal_get_entry(target_sdn, NULL, + &retentry, + pw_get_componentID()); + if (search_result != LDAP_SUCCESS) { LDAPDebug (LDAP_DEBUG_TRACE, "WARNING: 'get_entry' can't find entry '%s', err %d\n", dn, search_result, 0); } slapi_sdn_done(&sdn); @@ -224,7 +237,8 @@ bail: return retentry; }
-void pw_apply_mods(const char *dn, Slapi_Mods *mods) +void +pw_apply_mods(const Slapi_DN *sdn, Slapi_Mods *mods) { Slapi_PBlock pb; int res; @@ -234,7 +248,7 @@ void pw_apply_mods(const char *dn, Slapi_Mods *mods) pblock_init(&pb); /* We don't want to overwrite the modifiersname, etc. attributes, * so we set a flag for this operation */ - slapi_modify_internal_set_pb (&pb, dn, + slapi_modify_internal_set_pb_ext (&pb, sdn, slapi_mods_get_ldapmods_byref(mods), NULL, /* Controls */ NULL, /* UniqueID */ @@ -244,8 +258,9 @@ void pw_apply_mods(const char *dn, Slapi_Mods *mods) slapi_pblock_get(&pb, SLAPI_PLUGIN_INTOP_RESULT, &res); if (res != LDAP_SUCCESS){ - LDAPDebug(LDAP_DEBUG_ANY, "WARNING: passwordPolicy modify error %d on entry '%s'\n", - res, dn, 0); + LDAPDebug2Args(LDAP_DEBUG_ANY, + "WARNING: passwordPolicy modify error %d on entry '%s'\n", + res, slapi_sdn_get_dn(sdn)); } pblock_done(&pb); diff --git a/ldap/servers/slapd/rdn.c b/ldap/servers/slapd/rdn.c index 48d4d9e..c9f6386 100644 --- a/ldap/servers/slapd/rdn.c +++ b/ldap/servers/slapd/rdn.c @@ -132,12 +132,14 @@ _slapi_rdn_init_all_dn_ext(Slapi_RDN *rdn, const Slapi_DN *sdn) char **dns = NULL; int rc = 1;
- if (NULL == rdn || NULL == sdn) - { + if (NULL == rdn || NULL == sdn) { return -1; }
dn = slapi_sdn_get_dn(sdn); + if (NULL == dn) { + return -1; + } for (; isspace(*dn) ; dn++) ;
/* Suffix is a part of mapping tree. We should not free it */ @@ -227,13 +229,14 @@ int slapi_rdn_init_all_dn(Slapi_RDN *rdn, const char *dn) { int rc = 0; /* success */ - Slapi_DN sdn = {0}; + Slapi_DN sdn;
if (NULL == rdn || NULL == dn) { return -1; } slapi_rdn_init(rdn); + slapi_sdn_init(&sdn); slapi_sdn_set_dn_byval(&sdn, dn); rc = _slapi_rdn_init_all_dn_ext(rdn, (const Slapi_DN *)&sdn); slapi_sdn_done(&sdn); @@ -670,7 +673,19 @@ slapi_rdn_get_nrdn(Slapi_RDN *srdn) } if (NULL == srdn->nrdn) { - normalize_case_helper(srdn->rdn, &srdn->nrdn); + if (srdn->all_nrdns && srdn->all_nrdns[0]) + { + srdn->nrdn = slapi_ch_strdup(srdn->all_nrdns[0]); + } + else if (srdn->all_rdns && srdn->all_rdns[0]) + { + srdn->nrdn = slapi_ch_strdup(srdn->all_rdns[0]); + slapi_dn_ignore_case(srdn->nrdn); + } + else + { + normalize_case_helper(srdn->rdn, &srdn->nrdn); + } } return (const char *)srdn->nrdn; } diff --git a/ldap/servers/slapd/referral.c b/ldap/servers/slapd/referral.c index 458da81..b704f86 100644 --- a/ldap/servers/slapd/referral.c +++ b/ldap/servers/slapd/referral.c @@ -186,12 +186,13 @@ ref_adjust( Slapi_PBlock *pb, struct berval **urls, const Slapi_DN *refsdn, int is_reference ) { int i, len, scope; + Slapi_DN *sdn = NULL; char *p, *opdn_norm; struct berval **urlscopy; Operation *op;
if ( NULL == urls || NULL == urls[0] ) { - return( NULL ); + return( NULL ); }
PR_ASSERT( pb != NULL ); @@ -200,20 +201,20 @@ ref_adjust( Slapi_PBlock *pb, struct berval **urls, const Slapi_DN *refsdn, * grab the operation target DN and operation structure. * if the operation is a search, get the scope as well. */ - if ( slapi_pblock_get( pb, SLAPI_TARGET_DN, &p ) != 0 || p == NULL || - slapi_pblock_get( pb, SLAPI_OPERATION, &op ) != 0 || op == NULL || - ( operation_get_type(op) == SLAPI_OPERATION_SEARCH && slapi_pblock_get( pb, - SLAPI_SEARCH_SCOPE, &scope ) != 0 )) { - LDAPDebug( LDAP_DEBUG_ANY, "ref_adjust: referrals suppressed " - "(could not get target DN, operation, or scope from pblock)\n", - 0, 0, 0 ); - return( NULL ); + if ( slapi_pblock_get( pb, SLAPI_TARGET_SDN, &sdn ) != 0 || sdn == NULL || + slapi_pblock_get( pb, SLAPI_OPERATION, &op ) != 0 || op == NULL || + ( operation_get_type(op) == SLAPI_OPERATION_SEARCH && slapi_pblock_get( pb, + SLAPI_SEARCH_SCOPE, &scope ) != 0 )) { + LDAPDebug0Args( LDAP_DEBUG_ANY, "ref_adjust: referrals suppressed " + "(could not get target DN, operation, " + "or scope from pblock)\n" ); + return( NULL ); }
/* * normalize the DNs we plan to compare with others later. */ - opdn_norm = slapi_dn_normalize( slapi_ch_strdup( p )); + opdn_norm = slapi_ch_strdup( slapi_sdn_get_dn(sdn) );
/* @@ -355,7 +356,7 @@ adjust_referral_basedn( char **urlp, const Slapi_DN *refsdn, * Prepend the portion of the operation DN that does not match * the ref container DN to the referral baseDN. */ - add_len = strlen( opdn_norm ) - strlen( slapi_sdn_get_ndn(refsdn) ); + add_len = strlen( opdn_norm ) - slapi_sdn_get_ndn_len( refsdn ); cur_len = strlen( *urlp ); /* + 7 because we keep extra space in case we add ??base */ *urlp = slapi_ch_realloc( *urlp, cur_len + add_len + 7 ); @@ -377,7 +378,7 @@ adjust_referral_basedn( char **urlp, const Slapi_DN *refsdn, add_len = strlen(opdn_norm); p = opdn_norm; } else { - add_len = strlen(slapi_sdn_get_ndn(refsdn)); + add_len = slapi_sdn_get_ndn_len(refsdn); p = (char *)slapi_sdn_get_ndn(refsdn); } diff --git a/ldap/servers/slapd/result.c b/ldap/servers/slapd/result.c index 800fb39..a3fff38 100644 --- a/ldap/servers/slapd/result.c +++ b/ldap/servers/slapd/result.c @@ -289,8 +289,9 @@ send_ldap_result_ext( int i, rc, logit = 0; ber_tag_t tag; int flush_ber_element = 1; - Slapi_Operation *operation; - char *dn; + Slapi_Operation *operation; + const char *dn = NULL; + Slapi_DN *sdn = NULL; int internal_op; passwdPolicy *pwpolicy = NULL; @@ -368,8 +369,9 @@ send_ldap_result_ext( /* invalid password. Update the password retry here */ /* put this here for now. It could be a send_result pre-op plugin. */ if (err == LDAP_INVALID_CREDENTIALS) { - slapi_pblock_get( pb, SLAPI_TARGET_DN, &dn ); - pwpolicy = new_passwdPolicy(pb, dn); + slapi_pblock_get( pb, SLAPI_TARGET_SDN, &sdn ); + dn = slapi_sdn_get_dn(sdn); + pwpolicy = new_passwdPolicy(pb, dn); if (pwpolicy && (pwpolicy->pw_lockout == 1)) { update_pw_retry ( pb ); } diff --git a/ldap/servers/slapd/saslbind.c b/ldap/servers/slapd/saslbind.c index f9f51df..9e5bc36 100644 --- a/ldap/servers/slapd/saslbind.c +++ b/ldap/servers/slapd/saslbind.c @@ -783,6 +783,8 @@ void ids_sasl_check_bind(Slapi_PBlock *pb) sasl_ssf_t *ssfp; char *activemech = NULL, *mech = NULL; char *username, *dn = NULL; + const char *normdn = NULL; + Slapi_DN *sdn = NULL; const char *sdata, *errstr; unsigned slen; int continuing = 0; @@ -914,7 +916,7 @@ void ids_sasl_check_bind(Slapi_PBlock *pb) propctx = sasl_auxprop_getctx(sasl_conn); if (prop_getnames(propctx, dn_propnames, dnval) == 1) { if (dnval[0].values && dnval[0].values[0]) { - dn = slapi_ch_strdup(dnval[0].values[0]); + dn = slapi_ch_smprintf("%s", dnval[0].values[0]); } } if (dn == NULL) { @@ -924,8 +926,15 @@ void ids_sasl_check_bind(Slapi_PBlock *pb) break; }
- slapi_pblock_set( pb, SLAPI_BIND_TARGET, slapi_ch_strdup( dn ) ); - /* see if we negotiated a security layer */ + /* clean up already set TARGET */ + slapi_pblock_get(pb, SLAPI_BIND_TARGET_SDN, &sdn); + slapi_sdn_free(&sdn); + + sdn = slapi_sdn_new_dn_passin(dn); + normdn = slapi_sdn_get_dn(sdn); + + slapi_pblock_set( pb, SLAPI_BIND_TARGET_SDN, sdn ); + if ((sasl_getprop(sasl_conn, SASL_SSF, (const void**)&ssfp) == SASL_OK) && (*ssfp > 0)) { LDAPDebug(LDAP_DEBUG_TRACE, "sasl ssf=%u\n", (unsigned)*ssfp, 0, 0); @@ -947,7 +956,9 @@ void ids_sasl_check_bind(Slapi_PBlock *pb)
/* set the connection bind credentials */ PR_snprintf(authtype, sizeof(authtype), "%s%s", SLAPD_AUTH_SASL, mech); - bind_credentials_set_nolock(pb->pb_conn, authtype, dn, + /* normdn is consumed by bind_credentials_set_nolock */ + bind_credentials_set_nolock(pb->pb_conn, authtype, + slapi_ch_strdup(normdn), NULL, NULL, NULL, bind_target_entry);
PR_Unlock(pb->pb_conn->c_mutex); /* BIG LOCK */ @@ -956,12 +967,12 @@ void ids_sasl_check_bind(Slapi_PBlock *pb) break; }
- isroot = slapi_dn_isroot(dn); + isroot = slapi_dn_isroot(normdn);
if (!isroot ) { /* check if the account is locked */ - bind_target_entry = get_entry(pb, dn); + bind_target_entry = get_entry(pb, normdn); if ( bind_target_entry == NULL ) { goto out; @@ -975,7 +986,7 @@ void ids_sasl_check_bind(Slapi_PBlock *pb) slapi_pblock_get(pb, SLAPI_REQCONTROLS, &ctrls); if (slapi_control_present(ctrls, LDAP_CONTROL_AUTH_REQUEST, NULL, NULL)) { - slapi_add_auth_response_control(pb, dn); + slapi_add_auth_response_control(pb, normdn); }
if (slapi_mapping_tree_select(pb, &be, &referral, errorbuf) != LDAP_SUCCESS) { diff --git a/ldap/servers/slapd/search.c b/ldap/servers/slapd/search.c index ff4de17..6da7aa0 100644 --- a/ldap/servers/slapd/search.c +++ b/ldap/servers/slapd/search.c @@ -79,9 +79,6 @@ do_search( Slapi_PBlock *pb ) int send_entchg_controls; int changesonly = 0; int rc = -1; - char *original_base = 0; - char *new_base = 0; - size_t baselen = 0; int strict = 0;
LDAPDebug( LDAP_DEBUG_TRACE, "do_search\n", 0, 0, 0 ); @@ -138,24 +135,12 @@ do_search( Slapi_PBlock *pb ) return; } } - rc = slapi_dn_normalize_ext(rawbase, 0, &base, &baselen); - if (rc < 0) { - op_shared_log_error_access(pb, "SRCH", - rawbase?rawbase:"", "invalid dn"); - send_ldap_result(pb, LDAP_INVALID_DN_SYNTAX, - NULL, "invalid dn", 0, NULL); - slapi_ch_free((void **) &rawbase); - return; - } else if (rc > 0) { /* if rc == 0, rawbase is passed in */ - slapi_ch_free((void **) &rawbase); - } else { /* rc == 0; rawbase is passed in; not null terminated */ - *(base + baselen) = '\0'; - }
/* If anonymous access is only allowed for searching the root DSE, * we need to reject any other anonymous search attempts. */ - if ((slapi_sdn_get_dn(&(operation->o_sdn)) == NULL) && ((baselen != 0) || (scope != LDAP_SCOPE_BASE)) - && (config_get_anon_access_switch() == SLAPD_ANON_ACCESS_ROOTDSE)) { + if ((slapi_sdn_get_dn(&(operation->o_sdn)) == NULL) && + (scope != LDAP_SCOPE_BASE) && + (config_get_anon_access_switch() == SLAPD_ANON_ACCESS_ROOTDSE)) { op_shared_log_error_access(pb, "SRCH", base?base:"", "anonymous search not allowed");
send_ldap_result( pb, LDAP_INAPPROPRIATE_AUTH, NULL, @@ -178,7 +163,7 @@ do_search( Slapi_PBlock *pb ) && scope != LDAP_SCOPE_SUBTREE ) { log_search_access (pb, base, scope, "???", "Unknown search scope"); send_ldap_result( pb, LDAP_PROTOCOL_ERROR, NULL, - "Unknown search scope", 0, NULL ); + "Unknown search scope", 0, NULL ); goto free_and_return; } /* check and record the scope for snmp */ @@ -370,8 +355,7 @@ do_search( Slapi_PBlock *pb ) } }
- slapi_pblock_set( pb, SLAPI_SEARCH_TARGET, base ); - slapi_pblock_set( pb, SLAPI_ORIGINAL_TARGET_DN, slapi_ch_strdup(base) ); + slapi_pblock_set( pb, SLAPI_ORIGINAL_TARGET_DN, rawbase ); slapi_pblock_set( pb, SLAPI_SEARCH_SCOPE, &scope ); slapi_pblock_set( pb, SLAPI_SEARCH_DEREF, &deref ); slapi_pblock_set( pb, SLAPI_SEARCH_FILTER, filter ); @@ -383,16 +367,8 @@ do_search( Slapi_PBlock *pb ) slapi_pblock_set( pb, SLAPI_SEARCH_SIZELIMIT, &sizelimit ); slapi_pblock_set( pb, SLAPI_SEARCH_TIMELIMIT, &timelimit );
- /* plugins which play with the search may - * change the search params may allocate - * memory so we need to keep track of - * changed base search strings - */ - slapi_pblock_get(pb, SLAPI_SEARCH_TARGET, &original_base); - op_shared_search (pb, psearch ? 0 : 1/* send result */);
- slapi_pblock_get(pb, SLAPI_SEARCH_TARGET, &new_base); slapi_pblock_get (pb, SLAPI_PLUGIN_OPRETURN, &rc); slapi_pblock_get( pb, SLAPI_SEARCH_FILTER, &filter ); @@ -402,10 +378,6 @@ do_search( Slapi_PBlock *pb )
free_and_return:; if ( !psearch || rc < 0 ) { - if(original_base != new_base) { - slapi_ch_free_string(&new_base); - } - slapi_ch_free_string(&base); slapi_ch_free_string(&fstr); slapi_filter_free( filter, 1 ); charray_free( attrs ); /* passing NULL is fine */ @@ -418,8 +390,8 @@ free_and_return:; operation->o_flags &= ~OP_FLAG_PS; } /* we strdup'd this above - need to free */ - slapi_pblock_get(pb, SLAPI_ORIGINAL_TARGET_DN, &base); - slapi_ch_free_string(&base); + slapi_pblock_get(pb, SLAPI_ORIGINAL_TARGET_DN, &rawbase); + slapi_ch_free_string(&rawbase); } }
diff --git a/ldap/servers/slapd/slap.h b/ldap/servers/slapd/slap.h index 3a54564..acf7bbd 100644 --- a/ldap/servers/slapd/slap.h +++ b/ldap/servers/slapd/slap.h @@ -586,9 +586,10 @@ typedef int (*SyntaxEnumFunc)(char **names, Slapi_PluginDesc *plugindesc, struct slapi_dn { unsigned char flag; - const char *dn; /* DN [normalized] */ + const char *udn; /* DN [original] */ + const char *dn; /* Normalised DN */ const char *ndn; /* Case Normalised DN */ - int ndn_len; /* normalized dn length */ + int ndn_len; /* normalized dn length */ };
/* diff --git a/ldap/servers/slapd/slapi-plugin.h b/ldap/servers/slapd/slapi-plugin.h index c63e312..a27f8b1 100644 --- a/ldap/servers/slapd/slapi-plugin.h +++ b/ldap/servers/slapd/slapi-plugin.h @@ -710,13 +710,13 @@ int slapi_pblock_get( Slapi_PBlock *pb, int arg, void *value ); * <tt>char **arrays</tt>, <tt>#Slapi_Backend *</tt>, etc.), you can pass * in the value directly. For example: * \code - * char *target_dn = slapi_ch_strdup(some_dn); - * slapi_pblock_set(pb, SLAPI_TARGET_DN, target_dn); + * Slapi_DN *target_sdn = slapi_sdn_dup(some_sdn); + * slapi_pblock_set(pb, SLAPI_TARGET_SDN, target_sdn); * \endcode * * \warning or * \code - * slapi_pblock_set(pb, SLAPI_TARGET_DN, NULL); + * slapi_pblock_set(pb, SLAPI_TARGET_SDN, NULL); * \endcode * * \warning With some compilers, you will have to cast the value argument to @@ -802,6 +802,7 @@ void slapi_pblock_destroy( Slapi_PBlock *pb ); * \arg #SLAPI_STR2ENTRY_NO_SCHEMA_LOCK * \arg #SLAPI_STR2ENTRY_USE_OBSOLETE_DNFORMAT * \arg #SLAPI_STR2ENTRY_NO_ENTRYDN + * \arg #SLAPI_STR2ENTRY_DN_NORMALIZED * * \return A pointer to the #Slapi_Entry structure representing the entry. * \return \c NULL if the string cannot be converted; for example, if no DN is @@ -923,6 +924,15 @@ Slapi_Entry *slapi_str2entry_ext( const char *dn, char *s, int flags ); #define SLAPI_STR2ENTRY_NO_ENTRYDN 1024
/** + * Passed DN is already normalized. + * + * If this flag is set, str2entry assumes passed DN is already normalized. + * + * \see slapi_str2entry() + */ +#define SLAPI_STR2ENTRY_DN_NORMALIZED 2048 + +/** * Generates a description of an entry as an LDIF string. * * This function behaves much like slapi_entry2str(); however, you can specify @@ -1120,6 +1130,12 @@ Slapi_Entry *slapi_entry_alloc(void); */ void slapi_entry_init(Slapi_Entry *e, char *dn, Slapi_Attr *a);
+/* + * Initializes the values of an entry with the Slapi_DN and attribute value + * pairs you supply. + */ +void slapi_entry_init_ext(Slapi_Entry *e, Slapi_DN *sdn, Slapi_Attr *a); + /** * Frees an entry, its DN, and its attributes from memory. * @@ -1290,6 +1306,23 @@ const char *slapi_entry_get_nrdn_const( const Slapi_Entry *e ); void slapi_entry_set_dn( Slapi_Entry *e, char *dn );
/** + * Sets the normalized distinguished name (DN) of an entry. + * + * This function sets the DN pointer in the specified entry to the DN that you supply. The DN should have been normalized. + * + * \param e Entry to which you want to assign the DN. + * \param dn Distinguished name you want assigned to the entry. + * \warning The dn will be freed eventually when slapi_entry_free() is called. + * \warning A copy of dn should be passed. For example: + * + * \warning The old dn will be freed as a result of this call. Do not pass in + * a \c NULL value. + * \see slapi_entry_free() + * \see slapi_entry_get_dn() + */ +void slapi_entry_set_normdn( Slapi_Entry *e, char *normdn ); + +/** * Sets the relative distinguished name (RDN) of an entry. * * This function sets the RDN pointer in the specified entry to the RDN that @@ -1478,7 +1511,7 @@ int slapi_entry_syntax_check( Slapi_PBlock *pb, Slapi_Entry *e, int override ); * is also used to check if the #SLAPI_IS_REPLICATED_OPERATION flag is * set. If that flag is present, no syntax checking is performed. */ -int slapi_dn_syntax_check( Slapi_PBlock *pb, char *dn, int override ); +int slapi_dn_syntax_check( Slapi_PBlock *pb, const char *dn, int override );
/** * Determines if any values being added to an entry violate the syntax rules @@ -2181,14 +2214,14 @@ Slapi_DN *slapi_sdn_new_ndn_byval(const char *ndn); Slapi_DN *slapi_sdn_new_dn_byref(const char *dn);
/** - * Creates a new \c Slapi_DN structure and intializes it's normalized DN to a requested value. + * Creates a new \c Slapi_DN structure and intializes it's normalized and case ignored DN to a requested value. * - * The normalized DN of the new structure will point to the same string pointed to by \c ndn. - * The normalized DN value is passed in to the parameter by reference. + * The normalized and case ignored DN of the new structure will point to the same string pointed to by \c ndn. + * The normalized and case ignored DN value is passed in to the parameter by reference. * - * \param ndn The normalized DN value to be set in the new \c Slapi_DN structure. + * \param ndn The normalized and case ignored DN value to be set in the new \c Slapi_DN structure. * \return A pointer to the newly allocated \c Slapi_DN structure with - * the normalized DN value set to the content of \c ndn. + * the normalized and case ignored DN value set to the content of \c ndn. * \warning The caller is still responsible for the memory used by \c ndn. This * memory should not be freed until the returned \c Slapi_DN has been * disposed of or reinitialized. @@ -2220,6 +2253,60 @@ Slapi_DN *slapi_sdn_new_ndn_byref(const char *ndn); Slapi_DN *slapi_sdn_new_dn_passin(const char *dn);
/** + * Creates a new \c Slapi_DN structure and intializes it's normalized DN to a requested value. + * + * The DN of the new structure will point to the same string pointed to by \c normdn. + * The normalized DN value is passed in to the parameter by reference. + * + * \param normdn The normalized DN value to be set in the new \c Slapi_DN structure. + * \return A pointer to the newly allocated \c Slapi_DN structure with + * the normalized DN value set to the content of \c normdn. + * \warning The caller is still responsible for the memory used by \c normdn. + * This memory should not be freed until the returned \c Slapi_DN + * has been disposed of or reinitialized. + * \see slapi_sdn_free() + * \see slapi_sdn_copy() + * \see slapi_sdn_done() + */ +Slapi_DN *slapi_sdn_new_normdn_byref(const char *normdn); + +/** + * Creates a new \c Slapi_DN structure and intializes it's normalized DN to a requested value. + * + * The DN of the new structure will point to the same string pointed to by \c normdn. + * Ownership of the memory pointed to by \c normdn is tranferred to the Slapi_DN. + * + * \param normdn The DN value to be set in the new \c Slapi_DN structure. + * \return A pointer to the newly allocated \c Slapi_DN structure with + * a DN value set to the content of \c dn. + * \warning The caller is no longer responsible for the memory used by \c dn. + * This memory should not be freed directly. It will be freed when + * the \c Slapi_DN is properly disposed of. + * \see slapi_sdn_free() + * \see slapi_sdn_copy() + * \see slapi_sdn_done() + */ +Slapi_DN *slapi_sdn_new_normdn_passin(const char *dn); + +/** + * Creates a new \c Slapi_DN structure and intializes it's normalized DN to a requested value. + * + * The DN of the new structure will point to the duplicated string of \c normdn. + * Ownership of the memory pointed to by \c normdn is tranferred to the Slapi_DN. + * + * \param normdn The copy of the DN value to be set in the new \c Slapi_DN structure. + * \return A pointer to the newly allocated \c Slapi_DN structure with + * a DN value set to the content of \c dn. + * \warning The caller is no longer responsible for the memory used by \c dn. + * This memory should not be freed directly. It will be freed when + * the \c Slapi_DN is properly disposed of. + * \see slapi_sdn_free() + * \see slapi_sdn_copy() + * \see slapi_sdn_done() + */ +Slapi_DN *slapi_sdn_new_normdn_byval(const char *dn); + +/** * Sets a DN value in a \c Slapi_DN structure. * * The DN of the structure will point to a copy of the string pointed to by @@ -2272,6 +2359,56 @@ Slapi_DN *slapi_sdn_set_dn_passin(Slapi_DN *sdn, const char *dn); /** * Sets a normalized DN value in a \c Slapi_DN structure. * + * The DN of the structure will point to the same string pointed to by \c normdn. + * The normalized DN value is passed in to the parameter by reference. + * + * \param sdn The target \c Slapi_DN structure. + * \param normdn The normalized DN value to be set in \c sdn. + * \return A pointer to the \c Slapi_DN structure containing the new DN value. + * \warning The caller is still responsible for the memory used by \c normdn. + * This memory should not be freed until the returned \c Slapi_DN + * has been disposed of or reinitialized. + * \see slapi_sdn_set_dn_byref() + */ +Slapi_DN *slapi_sdn_set_normdn_byref(Slapi_DN *sdn, const char *normdn); + +/** + * Sets a normalized DN value in a \c Slapi_DN structure. + * + * The DN of the structure will point to the same string pointed to by \c normdn. + * Ownership of the memory pointed to by \c normdn is tranferred to the Slapi_DN. + * + * \param sdn The target \c Slapi_DN structure. + * \param normdn The normalized DN value to be set in \c sdn. + * \return A pointer to the \c Slapi_DN structure containing the new DN value. + * \warning The caller is no longer responsible for the memory used by \c normdn. + * This memory should not be freed directly. It will be freed when + * the \c Slapi_DN is properly disposed of. + * \see slapi_sdn_set_dn_passin() + */ +Slapi_DN *slapi_sdn_set_normdn_passin(Slapi_DN *sdn, const char *dn); + +/** + * Sets a normalized DN value in a \c Slapi_DN structure. + * + * The normalized DN of the structure will point to a copy of the string + * pointed to by \c dn. The normalized DN value is passed in to the parameter + * by value. + * Ownership of the memory pointed to by \c normdn is tranferred to the Slapi_DN. + * + * \param sdn The target \c Slapi_DN structure. + * \param normdn The normalized DN value to be set in \c sdn. + * \return A pointer to the \c Slapi_DN structure containing the new DN value. + * \warning The caller is no longer responsible for the memory used by \c normdn. + * This memory should not be freed directly. It will be freed when + * the \c Slapi_DN is properly disposed of. + * \see slapi_sdn_set_dn_passin() + */ +Slapi_DN *slapi_sdn_set_normdn_byval(Slapi_DN *sdn, const char *dn); + +/** + * Sets a normalized and case ignored DN value in a \c Slapi_DN structure. + * * The normalized DN of the structure will point to a copy of the string * pointed to by \c ndn. The normalized DN value is passed in to the parameter * by value. @@ -2325,33 +2462,52 @@ void slapi_sdn_done(Slapi_DN *sdn); void slapi_sdn_free(Slapi_DN **sdn);
/** - * Retrieves the DN value of a \c Slapi_DN structure. + * Retrieves the normalized DN value of a \c Slapi_DN structure. + * + * If the structure does not contain a normalized DN yet, it will normalize + * the un-normalized DN and set it in the structure. * * \param sdn The \c Slapi_DN strucure containing the DN value. * \return A pointer to the DN value if one is set. - * \return A pointer to the normalized DN value if one is set and no + * \return A pointer to the normalized and case ignored DN value if one is set and no * DN value is set. - * \return \c NULL if no DN or normalized DN value is set. + * \return \c NULL if no normalized DN or normalized and case ignored DN value is set. * \warning The pointer returned is the actual value from the structure, not a copy. * \see slapi_sdn_get_ndn() + * \see slapi_sdn_get_udn() */ const char * slapi_sdn_get_dn(const Slapi_DN *sdn);
/** - * Retrieves the normalized DN value of a \c Slapi_DN structure. + * Retrieves the normalized and case ignored DN value of a \c Slapi_DN structure. * - * If the structure does not contain a normalized DN yet, it will normalize - * the DN and set it in the structure. + * If the structure does not contain a normalized and case ignored DN yet, + * it will normalize and case ignore the DN and set it in the structure. * - * \param sdn The \c Slapi_DN strucure containing the normalized DN value. + * \param sdn The \c Slapi_DN strucure containing the normalized and case ignored DN value. * \return The normalized DN value. * \return \c NULL if no DN or normalized DN value is set. * \warning The pointer returned is the actual value from the structure, not a copy. * \see slapi_sdn_get_dn() + * \see slapi_sdn_get_udn() */ const char * slapi_sdn_get_ndn(const Slapi_DN *sdn);
/** + * Retrieves the un-normalized DN value of a \c Slapi_DN structure. + * + * \param sdn The \c Slapi_DN strucure containing the DN value. + * \return A pointer to the DN value if one is set. + * \return A pointer to the normalized DN value if one is set and no + * DN value is set. + * \return \c NULL if no DN or normalized DN value is set. + * \warning The pointer returned is the actual value from the structure, not a copy. + * \see slapi_sdn_get_dn() + * \see slapi_sdn_get_ndn() + */ +const char * slapi_sdn_get_udn(const Slapi_DN *sdn); + +/** * Fills in an existing \c Slapi_DN structure with the parent DN of the passed in \c Slapi_DN. * * \param sdn Pointer to the \c Slapi_DN structure containing the DN whose parent is desired. @@ -2555,7 +2711,7 @@ Slapi_DN *slapi_sdn_set_parent(Slapi_DN *sdn, const Slapi_DN *parentdn); * in \c newrdn in front of the content of this parameter. * \return The new DN for the entry whose previous DN was \c dn_olddn. */ -char * slapi_moddn_get_newdn(Slapi_DN *dn_olddn, char *newrdn, char *newsuperiordn); +char * slapi_moddn_get_newdn(Slapi_DN *dn_olddn, const char *newrdn, const char *newsuperiordn); Slapi_DN *slapi_sdn_add_rdn(Slapi_DN *sdn, const Slapi_RDN *rdn);
@@ -3167,6 +3323,16 @@ char *slapi_create_dn_string(const char *fmt, ...); char *slapi_create_dn_string_case(const char *fmt, ...);
/** + * Generates a valid value of RDN string + * + * \param fmt The format used to generate a value of RDN string. + * \param ... The arguments to generate an RDN string. + * \return A pointer to the generated RDN value. + * \return NULL if failed. + */ +char *slapi_create_rdn_value(const char *fmt, ...); + +/** * Converts a DN to lowercase. * * \param dn The DN to convert. @@ -5092,6 +5258,10 @@ void slapi_search_internal_set_pb(Slapi_PBlock *pb, const char *base, int scope, const char *filter, char **attrs, int attrsonly, LDAPControl **controls, const char *uniqueid, Slapi_ComponentId *plugin_identity, int operation_flags); +void slapi_search_internal_set_pb_ext(Slapi_PBlock *pb, Slapi_DN *sdn, + int scope, const char *filter, char **attrs, int attrsonly, + LDAPControl **controls, const char *uniqueid, + Slapi_ComponentId *plugin_identity, int operation_flags); void slapi_add_entry_internal_set_pb(Slapi_PBlock *pb, Slapi_Entry *e, LDAPControl **controls, Slapi_ComponentId *plugin_identity, int operation_flags); @@ -5101,10 +5271,28 @@ int slapi_add_internal_set_pb(Slapi_PBlock *pb, const char *dn, void slapi_modify_internal_set_pb(Slapi_PBlock *pb, const char *dn, LDAPMod **mods, LDAPControl **controls, const char *uniqueid, Slapi_ComponentId *plugin_identity, int operation_flags); -void slapi_rename_internal_set_pb(Slapi_PBlock *pb, const char *olddn, - const char *newrdn, const char *newsuperior, int deloldrdn, +void slapi_modify_internal_set_pb_ext(Slapi_PBlock *pb, const Slapi_DN *sdn, + LDAPMod **mods, LDAPControl **controls, const char *uniqueid, + Slapi_ComponentId *plugin_identity, int operation_flags); +/** + * Set \c Slapi_PBlock to perform modrdn/rename internally + * + * \param pblock - Slapi_PBlock to be set + * \param olddn - original dn to be renamed; it should have been normalized + * \param newrdn - new leaf rdn if any; it should have been normalized + * \param newsuperior - new parent dn if any; it should have been normalized + * \param deloldrdn \c 0 - keep original rdn \c non-zero - delete original rdn + * \param controls + * \param uniqueid + * \param plugin_identity + * \param operation_flags + */ +void slapi_rename_internal_set_pb_ext(Slapi_PBlock *pb, + const Slapi_DN *olddn, const char *newrdn, + const Slapi_DN *newsuperior, int deloldrdn, LDAPControl **controls, const char *uniqueid, Slapi_ComponentId *plugin_identity, int operation_flags); + void slapi_delete_internal_set_pb(Slapi_PBlock *pb, const char *dn, LDAPControl **controls, const char *uniqueid, Slapi_ComponentId *plugin_identity, int operation_flags); @@ -5811,6 +5999,7 @@ time_t slapi_current_time( void ); /* operation */ #define SLAPI_OPINITIATED_TIME 140 #define SLAPI_REQUESTOR_DN 141 +#define SLAPI_REQUESTOR_NDN 156 #define SLAPI_OPERATION_PARAMETERS 138 #define SLAPI_OPERATION_TYPE 590 #define SLAPI_OPERATION_AUTHTYPE 741 @@ -6084,7 +6273,10 @@ typedef struct slapi_plugindesc { /* arguments that are common to all operation */ #define SLAPI_TARGET_ADDRESS 48 /* target address (dn + uniqueid) should be normalized */ #define SLAPI_TARGET_UNIQUEID 49 /* target uniqueid of the operation */ -#define SLAPI_TARGET_DN 50 /* target dn of the operation should be normalized */ +#define SLAPI_TARGET_DN 50 /* DEPRECATED. target dn of the operation. + It actually points DN in SLAPI_TARGET_SDN. */ +#define SLAPI_TARGET_SDN 47 /* target sdn of the operation */ + #define SLAPI_REQCONTROLS 51 /* request controls */
/* Copies of entry before and after add, mod, mod[r]dn operations */ @@ -6122,7 +6314,8 @@ typedef struct slapi_plugindesc { #define SLAPI_DESTROY_CONTENT 59
/* add arguments */ -#define SLAPI_ADD_TARGET SLAPI_TARGET_DN +#define SLAPI_ADD_TARGET SLAPI_TARGET_DN /* DEPRECATED */ +#define SLAPI_ADD_TARGET_SDN SLAPI_TARGET_SDN #define SLAPI_ADD_ENTRY 60 #define SLAPI_ADD_EXISTING_DN_ENTRY 61 #define SLAPI_ADD_PARENT_ENTRY 62 @@ -6130,7 +6323,8 @@ typedef struct slapi_plugindesc { #define SLAPI_ADD_EXISTING_UNIQUEID_ENTRY 64
/* bind arguments */ -#define SLAPI_BIND_TARGET SLAPI_TARGET_DN +#define SLAPI_BIND_TARGET SLAPI_TARGET_DN /* DEPRECATED */ +#define SLAPI_BIND_TARGET_SDN SLAPI_TARGET_SDN #define SLAPI_BIND_METHOD 70 #define SLAPI_BIND_CREDENTIALS 71 /* v3 only */ #define SLAPI_BIND_SASLMECHANISM 72 /* v3 only */ @@ -6138,27 +6332,32 @@ typedef struct slapi_plugindesc { #define SLAPI_BIND_RET_SASLCREDS 73 /* v3 only */
/* compare arguments */ -#define SLAPI_COMPARE_TARGET SLAPI_TARGET_DN +#define SLAPI_COMPARE_TARGET SLAPI_TARGET_DN /* DEPRECATED */ +#define SLAPI_COMPARE_TARGET_SDN SLAPI_TARGET_SDN #define SLAPI_COMPARE_TYPE 80 #define SLAPI_COMPARE_VALUE 81
/* delete arguments */ -#define SLAPI_DELETE_TARGET SLAPI_TARGET_DN +#define SLAPI_DELETE_TARGET SLAPI_TARGET_DN /* DEPRECATED */ +#define SLAPI_DELETE_TARGET_SDN SLAPI_TARGET_SDN #define SLAPI_DELETE_EXISTING_ENTRY SLAPI_ADD_EXISTING_DN_ENTRY #define SLAPI_DELETE_GLUE_PARENT_ENTRY SLAPI_ADD_PARENT_ENTRY #define SLAPI_DELETE_BEPREOP_ENTRY SLAPI_ENTRY_PRE_OP #define SLAPI_DELETE_BEPOSTOP_ENTRY SLAPI_ENTRY_POST_OP
/* modify arguments */ -#define SLAPI_MODIFY_TARGET SLAPI_TARGET_DN +#define SLAPI_MODIFY_TARGET SLAPI_TARGET_DN /* DEPRECATED */ +#define SLAPI_MODIFY_TARGET_SDN SLAPI_TARGET_SDN #define SLAPI_MODIFY_MODS 90 #define SLAPI_MODIFY_EXISTING_ENTRY SLAPI_ADD_EXISTING_DN_ENTRY
/* modrdn arguments */ -#define SLAPI_MODRDN_TARGET SLAPI_TARGET_DN +#define SLAPI_MODRDN_TARGET SLAPI_TARGET_DN /* DEPRECATED */ +#define SLAPI_MODRDN_TARGET_SDN SLAPI_TARGET_SDN #define SLAPI_MODRDN_NEWRDN 100 #define SLAPI_MODRDN_DELOLDRDN 101 #define SLAPI_MODRDN_NEWSUPERIOR 102 /* v3 only */ +#define SLAPI_MODRDN_NEWSUPERIOR_SDN 103 /* v3 only */ #define SLAPI_MODRDN_EXISTING_ENTRY SLAPI_ADD_EXISTING_DN_ENTRY #define SLAPI_MODRDN_PARENT_ENTRY 104 #define SLAPI_MODRDN_NEWPARENT_ENTRY 105 @@ -6173,7 +6372,8 @@ typedef struct slapi_plugindesc { #define SLAPI_ORIGINAL_TARGET SLAPI_ORIGINAL_TARGET_DN
/* search arguments */ -#define SLAPI_SEARCH_TARGET SLAPI_TARGET_DN +#define SLAPI_SEARCH_TARGET SLAPI_TARGET_DN /* DEPRECATED */ +#define SLAPI_SEARCH_TARGET_SDN SLAPI_TARGET_SDN #define SLAPI_SEARCH_SCOPE 110 #define SLAPI_SEARCH_DEREF 111 #define SLAPI_SEARCH_SIZELIMIT 112 diff --git a/ldap/servers/slapd/slapi-private.h b/ldap/servers/slapd/slapi-private.h index bedc9f5..2b717a0 100644 --- a/ldap/servers/slapd/slapi-private.h +++ b/ldap/servers/slapd/slapi-private.h @@ -376,7 +376,9 @@ Slapi_DN *slapi_sdn_init_dn_byval(Slapi_DN *sdn,const char *dn); Slapi_DN *slapi_sdn_init_dn_passin(Slapi_DN *sdn,const char *dn); Slapi_DN *slapi_sdn_init_ndn_byref(Slapi_DN *sdn,const char *dn); Slapi_DN *slapi_sdn_init_ndn_byval(Slapi_DN *sdn,const char *dn); -Slapi_DN *slapi_sdn_init_dn_ndn_byref(Slapi_DN *sdn,const char *dn); +Slapi_DN *slapi_sdn_init_normdn_byref(Slapi_DN *sdn, const char *dn); +Slapi_DN *slapi_sdn_init_normdn_ndn_passin(Slapi_DN *sdn, const char *dn); +Slapi_DN *slapi_sdn_init_normdn_passin(Slapi_DN *sdn, const char *dn); char *slapi_dn_normalize_original( char *dn ); char *slapi_dn_normalize_case_original( char *dn );
@@ -520,10 +522,10 @@ int test_presence_filter( Slapi_PBlock *pb, Slapi_Entry *e, char *type, /* this structure allows to address entry by dn or uniqueid */ typedef struct entry_address { - char *dn; char *udn; /* unnormalized dn */ char *uniqueid; -}entry_address; + Slapi_DN *sdn; +} entry_address;
/* * LDAP Operation input parameters. @@ -671,6 +673,7 @@ void slapi_send_ldap_result_from_pb( Slapi_PBlock *pb); typedef struct mt_node mapping_tree_node; mapping_tree_node *slapi_get_mapping_tree_node_by_dn(const Slapi_DN *dn); char* slapi_get_mapping_tree_node_configdn(const Slapi_DN *root); +Slapi_DN* slapi_get_mapping_tree_node_configsdn(const Slapi_DN *root); const Slapi_DN* slapi_get_mapping_tree_node_root(const mapping_tree_node *node); const char* slapi_get_mapping_tree_config_root (); Slapi_Backend *slapi_mapping_tree_find_backend_for_sdn(Slapi_DN *sdn); @@ -812,7 +815,7 @@ char ** cool_charray_dup( char **a ); void cool_charray_free( char **array ); void charray_subtract( char **a, char **b, char ***c ); int charray_get_index(char **array, char *s); - +int charray_normdn_add(char ***chararray, char *dn, char *errstr);
/****************************************************************************** * value array routines. diff --git a/ldap/servers/slapd/task.c b/ldap/servers/slapd/task.c index 999d004..6d60775 100644 --- a/ldap/servers/slapd/task.c +++ b/ldap/servers/slapd/task.c @@ -779,13 +779,25 @@ static int task_import_add(Slapi_PBlock *pb, Slapi_Entry *e, if (slapi_entry_attr_find(e, "nsIncludeSuffix", &attr) == 0) { for (idx = slapi_attr_first_value(attr, &val); idx >= 0; idx = slapi_attr_next_value(attr, idx, &val)) { - charray_add(&include, slapi_ch_strdup(slapi_value_get_string(val))); + rv = charray_normdn_add(&include, + (char *)slapi_value_get_string(val), + "nsIncludeSuffix"); + if (0 != rv) { + *returncode = LDAP_PARAM_ERROR; + return SLAPI_DSE_CALLBACK_ERROR; + } } } if (slapi_entry_attr_find(e, "nsExcludeSuffix", &attr) == 0) { for (idx = slapi_attr_first_value(attr, &val); idx >= 0; idx = slapi_attr_next_value(attr, idx, &val)) { - charray_add(&exclude, slapi_ch_strdup(slapi_value_get_string(val))); + rv = charray_normdn_add(&exclude, + (char *)slapi_value_get_string(val), + "nsExcludeSuffix"); + if (0 != rv) { + *returncode = LDAP_PARAM_ERROR; + return SLAPI_DSE_CALLBACK_ERROR; + } } }
@@ -1090,13 +1102,25 @@ static int task_export_add(Slapi_PBlock *pb, Slapi_Entry *e, if (slapi_entry_attr_find(e, "nsIncludeSuffix", &attr) == 0) { for (idx = slapi_attr_first_value(attr, &val); idx >= 0; idx = slapi_attr_next_value(attr, idx, &val)) { - charray_add(&include, slapi_ch_strdup(slapi_value_get_string(val))); + rv = charray_normdn_add(&include, + (char *)slapi_value_get_string(val), + "nsIncludeSuffix"); + if (0 != rv) { + *returncode = LDAP_PARAM_ERROR; + goto out; + } } } if (slapi_entry_attr_find(e, "nsExcludeSuffix", &attr) == 0) { for (idx = slapi_attr_first_value(attr, &val); idx >= 0; idx = slapi_attr_next_value(attr, idx, &val)) { - charray_add(&exclude, slapi_ch_strdup(slapi_value_get_string(val))); + rv = charray_normdn_add(&exclude, + (char *)slapi_value_get_string(val), + "nsExcludeSuffix"); + if (0 != rv) { + *returncode = LDAP_PARAM_ERROR; + goto out; + } } }
diff --git a/ldap/servers/slapd/tools/ldclt/ldapfct.c b/ldap/servers/slapd/tools/ldclt/ldapfct.c index 23d0a04..4d58d88 100644 --- a/ldap/servers/slapd/tools/ldclt/ldapfct.c +++ b/ldap/servers/slapd/tools/ldclt/ldapfct.c @@ -1764,10 +1764,7 @@ error: }
done: - /* - * Normal end - */ - return (0); + return rc; }
diff --git a/ldap/servers/slapd/util.c b/ldap/servers/slapd/util.c index 5cb2711..b91ec12 100644 --- a/ldap/servers/slapd/util.c +++ b/ldap/servers/slapd/util.c @@ -439,24 +439,18 @@ normalize_mods2bvals(const LDAPMod **mods) mbvp && *mbvp; mbvp++, normmbvp++) { if (is_dn_syntax) { - int rc = 0; - char *normed = NULL; - size_t dnlen = 0; - - rc = slapi_dn_normalize_ext((*mbvp)->bv_val, - (*mbvp)->bv_len, - &normed, &dnlen); - if (rc < 0) { /* normalization failed; use the original */ - *normmbvp = ber_bvdup(*mbvp); - } else if (rc == 0) { /* if rc == 0, value is passed in */ - *(normed + dnlen) = '\0'; - *normmbvp = ber_bvdup(*mbvp); - } else { + Slapi_DN *sdn = slapi_sdn_new_dn_byref((*mbvp)->bv_val); + if (slapi_sdn_get_dn(sdn)) { *normmbvp = (struct berval *)slapi_ch_malloc(sizeof(struct berval)); - (*normmbvp)->bv_val = normed; - (*normmbvp)->bv_len = dnlen; + (*normmbvp)->bv_val = + slapi_ch_strdup(slapi_sdn_get_dn(sdn)); + (*normmbvp)->bv_len = slapi_sdn_get_ndn_len(sdn); + } else { + /* normalization failed; use the original */ + *normmbvp = ber_bvdup(*mbvp); } + slapi_sdn_free(&sdn); } else { *normmbvp = ber_bvdup(*mbvp); } @@ -474,26 +468,21 @@ normalize_mods2bvals(const LDAPMod **mods) vlen = strlen(*mvp);
if (is_dn_syntax) { - int rc = 0; - char *normed = NULL; - size_t dnlen = 0; - rc = slapi_dn_normalize_ext(*mvp, vlen, - &normed, &dnlen); - if (rc < 0) { /* normalization failed; use the original */ + Slapi_DN *sdn = slapi_sdn_new_dn_byref(*mvp); + if (slapi_sdn_get_dn(sdn)) { + *normmbvp = + (struct berval *)slapi_ch_malloc(sizeof(struct berval)); + (*normmbvp)->bv_val = + slapi_ch_strdup(slapi_sdn_get_dn(sdn)); + (*normmbvp)->bv_len = slapi_sdn_get_ndn_len(sdn); + } else { + /* normalization failed; use the original */ (*normmbvp)->bv_val = slapi_ch_malloc(vlen + 1); memcpy((*normmbvp)->bv_val, *mvp, vlen); (*normmbvp)->bv_val[vlen] = '\0'; (*normmbvp)->bv_len = vlen; - } else if (rc == 0) { /* if rc == 0, value is passed in */ - *(normed + dnlen) = '\0'; - (*normmbvp)->bv_val = slapi_ch_strdup(normed); - (*normmbvp)->bv_len = dnlen; - } else { - *normmbvp = - (struct berval *)slapi_ch_malloc(sizeof(struct berval)); - (*normmbvp)->bv_val = normed; - (*normmbvp)->bv_len = dnlen; } + slapi_sdn_free(&sdn); } else { (*normmbvp)->bv_val = slapi_ch_malloc(vlen + 1); memcpy((*normmbvp)->bv_val, *mvp, vlen); diff --git a/ldap/servers/slapd/uuid.c b/ldap/servers/slapd/uuid.c index 4a3ec8e..03244de 100644 --- a/ldap/servers/slapd/uuid.c +++ b/ldap/servers/slapd/uuid.c @@ -655,14 +655,13 @@ static int add_state_entry () struct berval val; Slapi_Entry *e; Slapi_PBlock *pb = NULL; - const char *dn = slapi_sdn_get_ndn (_state.configDN); int rt;
vals[0] = &val; vals[1] = NULL;
e = slapi_entry_alloc(); - slapi_entry_set_dn(e, slapi_ch_strdup(dn)); + slapi_entry_set_sdn(e, _state.configDN);
/* Set the objectclass attribute */ val.bv_val = "top"; diff --git a/ldap/servers/slapd/value.c b/ldap/servers/slapd/value.c index 1faf31a..2817eaf 100644 --- a/ldap/servers/slapd/value.c +++ b/ldap/servers/slapd/value.c @@ -313,7 +313,7 @@ slapi_value_set( Slapi_Value *value, void *val, unsigned long len) { struct berval bv; bv.bv_len= len; - bv.bv_val= (void*)val; /* We cast away the const, but we're not going to change anything */ + bv.bv_val= val; /* We cast away the const, but we're not going to change anything */ slapi_value_set_berval( value, &bv); return value; } @@ -570,26 +570,21 @@ value_dump( const Slapi_Value *value, const char *text) int value_normalize_value(Slapi_Value *value) { - char *normval = NULL; - size_t len = 0; + Slapi_DN *sdn = NULL; int rc = 0;
if (NULL == value) { - return 0; + return rc; }
- rc = slapi_dn_normalize_ext(value->bv.bv_val, value->bv.bv_len, - &normval, &len); - if (rc < 0) { - return 1; - } else if (rc > 0) { /* if rc == 0, the original value is passed in */ - slapi_ch_free_string(&value->bv.bv_val); - } else { /* rc == 0; original is passed in; not null terminated */ - /* since bvalue, no need to terminate with null, tho */ - *(normval + len) = '\0'; + sdn = slapi_sdn_new_dn_passin(value->bv.bv_val); + if (slapi_sdn_get_dn(sdn)) { + value->bv.bv_val = slapi_ch_strdup(slapi_sdn_get_dn(sdn)); + value->bv.bv_len = slapi_sdn_get_ndn_len(sdn); + } else { + rc = 1; } - value->bv.bv_val = normval; - value->bv.bv_len = len; + slapi_sdn_free(&sdn);
- return 0; + return rc; } diff --git a/lib/libaccess/lasdns.cpp b/lib/libaccess/lasdns.cpp index a81f680..6956878 100644 --- a/lib/libaccess/lasdns.cpp +++ b/lib/libaccess/lasdns.cpp @@ -151,6 +151,7 @@ LASDnsBuild(NSErr_t *errp, char *attr_pattern, LASDnsContext_t *context, int ali #else PRHostEnt *he, host; #endif + char *end_attr_pattern;
if (attr_pattern == NULL) { nserrGenerate(errp, ACLERRINVAL, ACLERR4770, ACL_Program, 1, @@ -172,6 +173,7 @@ LASDnsBuild(NSErr_t *errp, char *attr_pattern, LASDnsContext_t *context, int ali return LAS_EVAL_INVALID; }
+ end_attr_pattern = attr_pattern + strlen(attr_pattern); do { size_t maxsize = sizeof(token); /* Get a single hostname from the pattern string */ @@ -183,8 +185,10 @@ LASDnsBuild(NSErr_t *errp, char *attr_pattern, LASDnsContext_t *context, int ali token[delimiter] = '\0';
/* Skip any white space after the token */ - attr_pattern += delimiter; - attr_pattern += strspn(attr_pattern, ", \t"); + attr_pattern += delimiter; + if (attr_pattern < end_attr_pattern) { + attr_pattern += strspn(attr_pattern, ", \t"); + }
/* If there's a wildcard, strip it off but leave the "." * Can't have aliases for a wildcard pattern.
389-commits@lists.fedoraproject.org