]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/slapi/slapi_utils.c
Add SLAPI_X_OPERATION_NO_SUBORDINATE_GLUE for exposing o_no_subordinate_glue
[openldap] / servers / slapd / slapi / slapi_utils.c
index 867cc56659c909492b91760dba149c05b8672cfc..d3fa90ab745c84f0e1290c5fece7aa6f3699eee8 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 2002-2005 The OpenLDAP Foundation.
+ * Copyright 2002-2006 The OpenLDAP Foundation.
  * Portions Copyright 1997,2002-2003 IBM Corporation.
  * All rights reserved.
  *
@@ -110,16 +110,7 @@ slapi_str2entry(
        char            *s, 
        int             flags )
 {
-       Slapi_Entry     *e = NULL;
-       char            *pTmpS;
-
-       pTmpS = slapi_ch_strdup( s );
-       if ( pTmpS != NULL ) {
-               e = str2entry( pTmpS ); 
-               slapi_ch_free( (void **)&pTmpS );
-       }
-
-       return e;
+       return str2entry( s );
 }
 
 char *
@@ -127,10 +118,13 @@ slapi_entry2str(
        Slapi_Entry     *e, 
        int             *len ) 
 {
-       char            *ret;
+       char            *ret = NULL;
+       char            *s;
 
        ldap_pvt_thread_mutex_lock( &entry2str_mutex );
-       ret = entry2str( e, len );
+       s = entry2str( e, len );
+       if ( s != NULL )
+               ret = slapi_ch_strdup( s );
        ldap_pvt_thread_mutex_unlock( &entry2str_mutex );
 
        return ret;
@@ -232,12 +226,12 @@ slapi_entry_attr_merge(
        BerVarray               bv;
        int                     rc;
 
-       rc = bvptr2obj( vals, &bv );
+       rc = slap_str2ad( type, &ad, &text );
        if ( rc != LDAP_SUCCESS ) {
                return -1;
        }
        
-       rc = slap_str2ad( type, &ad, &text );
+       rc = bvptr2obj( vals, &bv );
        if ( rc != LDAP_SUCCESS ) {
                return -1;
        }
@@ -909,6 +903,7 @@ slapi_dn_parent( const char *_dn )
 {
        struct berval   dn, prettyDN;
        struct berval   parentDN;
+       char            *ret;
 
        if ( _dn == NULL ) {
                return NULL;
@@ -927,13 +922,15 @@ slapi_dn_parent( const char *_dn )
 
        dnParent( &prettyDN, &parentDN ); /* in-place */
 
-       slapi_ch_free( (void **)&prettyDN.bv_val );
-
        if ( parentDN.bv_len == 0 ) {
+               slapi_ch_free_string( &prettyDN.bv_val );
                return NULL;
        }
 
-       return slapi_ch_strdup( parentDN.bv_val );
+       ret = slapi_ch_strdup( parentDN.bv_val );
+       slapi_ch_free_string( &prettyDN.bv_val );
+
+       return ret;
 }
 
 int slapi_dn_isbesuffix( Slapi_PBlock *pb, char *ldn )
@@ -1044,14 +1041,7 @@ slapi_ch_array_free( char **arrayp )
 struct berval *
 slapi_ch_bvdup(const struct berval *v)
 {
-       struct berval *bv;
-
-       bv = (struct berval *) slapi_ch_malloc( sizeof(struct berval) );
-       bv->bv_len = v->bv_len;
-       bv->bv_val = slapi_ch_malloc( bv->bv_len );
-       AC_MEMCPY( bv->bv_val, v->bv_val, bv->bv_len );
-
-       return bv;
+       return ber_dupbv(NULL, (struct berval *)v);
 }
 
 struct berval **
@@ -1359,8 +1349,13 @@ slapi_send_ldap_result(
        } else {
                if ( pb->pb_op->o_tag == LDAP_REQ_SEARCH )
                        rs->sr_nentries = nentries;
+               if ( urls != NULL )
+                       bvptr2obj( urls, &rs->sr_ref );
 
                send_ldap_result( pb->pb_op, rs );
+
+               if ( urls != NULL )
+                       slapi_ch_free( (void **)&rs->sr_ref );
        }
 }
 
@@ -1373,7 +1368,7 @@ slapi_send_ldap_search_entry(
        int             attrsonly )
 {
        SlapReply               rs = { REP_SEARCH };
-       int                     i = 0;
+       int                     i = 0, j = 0;
        AttributeName           *an = NULL;
        const char              *text;
        int                     rc;
@@ -1387,19 +1382,17 @@ slapi_send_ldap_search_entry(
        }
 
        if ( i ) {
-               an = (AttributeName *) slapi_ch_malloc( (i+1) * sizeof(AttributeName) );
+               an = (AttributeName *) slapi_ch_calloc( i + 1, sizeof(AttributeName) );
                for ( i = 0; attrs[i] != NULL; i++ ) {
-                       an[i].an_name.bv_val = attrs[i];
-                       an[i].an_name.bv_len = strlen( attrs[i] );
-                       an[i].an_desc = NULL;
-                       rs.sr_err = slap_bv2ad( &an[i].an_name, &an[i].an_desc, &text );
-                       if ( rs.sr_err != LDAP_SUCCESS) {
-                               slapi_ch_free( (void **)&an );
-                               return -1;
+                       an[j].an_name.bv_val = attrs[i];
+                       an[j].an_name.bv_len = strlen( attrs[i] );
+                       an[j].an_desc = NULL;
+                       if ( slap_bv2ad( &an[j].an_name, &an[j].an_desc, &text ) == LDAP_SUCCESS) {
+                               j++;
                        }
                }
-               an[i].an_name.bv_len = 0;
-               an[i].an_name.bv_val = NULL;
+               an[j].an_name.bv_len = 0;
+               an[j].an_name.bv_val = NULL;
        }
 
        rs.sr_err = LDAP_SUCCESS;
@@ -1481,77 +1474,7 @@ slapi_filter_free(
 Slapi_Filter *
 slapi_filter_dup( Slapi_Filter *filter )
 {
-       Filter *f;
-
-       f = (Filter *) slapi_ch_malloc( sizeof(Filter) );
-       f->f_next = NULL;
-       f->f_choice = filter->f_choice;
-
-       switch ( f->f_choice ) {
-       case LDAP_FILTER_AND:
-       case LDAP_FILTER_NOT:
-       case LDAP_FILTER_OR: {
-               Filter *pFilter, **ppF;
-
-               for ( pFilter = filter->f_list, ppF = &f->f_list;
-                     pFilter != NULL;
-                     pFilter = pFilter->f_next, ppF = &f->f_next )
-               {
-                       *ppF = slapi_filter_dup( pFilter );
-                       if ( *ppF == NULL )
-                               break;
-               }
-               break;
-       }
-       case LDAP_FILTER_PRESENT:
-               f->f_desc = filter->f_desc;
-               break;
-       case LDAP_FILTER_EQUALITY:
-       case LDAP_FILTER_GE:
-       case LDAP_FILTER_LE:
-       case LDAP_FILTER_APPROX:
-               f->f_ava = (AttributeAssertion *)slapi_ch_malloc( sizeof(AttributeAssertion) );
-               f->f_ava->aa_desc = filter->f_ava->aa_desc;
-               ber_dupbv( &f->f_ava->aa_value, &filter->f_ava->aa_value );
-               break;
-       case LDAP_FILTER_EXT:
-               f->f_mra = (MatchingRuleAssertion *)slapi_ch_malloc( sizeof(MatchingRuleAssertion) );
-               f->f_mra->ma_rule = filter->f_mra->ma_rule;
-               f->f_mra->ma_rule_text = filter->f_mra->ma_rule_text; /* struct copy */
-               f->f_mra->ma_desc = filter->f_mra->ma_desc;
-               f->f_mra->ma_dnattrs = filter->f_mra->ma_dnattrs;
-               ber_dupbv( &f->f_mra->ma_value, &filter->f_mra->ma_value );
-               break;
-       case LDAP_FILTER_SUBSTRINGS: {
-               int i;
-
-               f->f_sub = (SubstringsAssertion *)slapi_ch_malloc( sizeof(SubstringsAssertion) );
-               f->f_sub->sa_desc = filter->f_sub->sa_desc;
-               ber_dupbv( &f->f_sub_initial, &filter->f_sub_initial );
-               if ( filter->f_sub_any != NULL ) {
-                       for ( i = 0; filter->f_sub_any[i].bv_val != NULL; i++ )
-                               ;
-                       f->f_sub_any = (BerVarray)slapi_ch_malloc( (i + 1) * (sizeof(struct berval)) );
-                       for ( i = 0; filter->f_sub_any[i].bv_val != NULL; i++ ) {
-                               ber_dupbv( &f->f_sub_any[i], &filter->f_sub_any[i] );
-                       }
-                       f->f_sub_any[i].bv_val = NULL;
-               } else {
-                       f->f_sub_any = NULL;
-               }
-               ber_dupbv( &f->f_sub_final, &filter->f_sub_final );
-               break;
-       }
-       case SLAPD_FILTER_COMPUTED:
-               f->f_result = filter->f_result;
-               break;
-       default:
-               slapi_ch_free( (void **)&f );
-               f = NULL;
-               break;
-       }
-
-       return f;
+       return filter_dup( filter, NULL );
 }
 
 int 
@@ -2533,9 +2456,9 @@ void slapi_valueset_free(Slapi_ValueSet *vs)
                BerVarray vp = *vs;
 
                ber_bvarray_free( vp );
-               slapi_ch_free( (void **)&vp );
+               vp = NULL;
 
-               *vs = NULL;
+               slapi_ch_free( (void **)&vp );
        }
 }
 
@@ -2605,6 +2528,9 @@ int slapi_valueset_count( const Slapi_ValueSet *vs )
 
        vp = *vs;
 
+       if ( vp == NULL )
+               return 0;
+
        for ( i = 0; vp[i].bv_val != NULL; i++ )
                ;
 
@@ -2697,20 +2623,14 @@ int slapi_acl_check_mods(Slapi_PBlock *pb, Slapi_Entry *e, LDAPMod **mods, char
 
 /*
  * Synthesise an LDAPMod array from a Modifications list to pass
- * to SLAPI. This synthesis is destructive and as such the 
- * Modifications list may not be used after calling this 
- * function.
- * 
- * This function must also be called before slap_mods_check().
+ * to SLAPI.
  */
-LDAPMod **slapi_int_modifications2ldapmods( Modifications **pmodlist )
+LDAPMod **slapi_int_modifications2ldapmods( Modifications *modlist )
 {
-       Modifications *ml, *modlist;
+       Modifications *ml;
        LDAPMod **mods, *modp;
        int i, j;
 
-       modlist = *pmodlist;
-
        for( i = 0, ml = modlist; ml != NULL; i++, ml = ml->sml_next )
                ;
 
@@ -2720,8 +2640,13 @@ LDAPMod **slapi_int_modifications2ldapmods( Modifications **pmodlist )
                mods[i] = (LDAPMod *)slapi_ch_malloc( sizeof(LDAPMod) );
                modp = mods[i];
                modp->mod_op = ml->sml_op | LDAP_MOD_BVALUES;
-               modp->mod_type = slapi_ch_strdup( ml->sml_type.bv_val );
-               ml->sml_type.bv_val = NULL;
+               if ( BER_BVISNULL( &ml->sml_type ) ) {
+                       /* may happen for internally generated mods */
+                       assert( ml->sml_desc != NULL );
+                       modp->mod_type = slapi_ch_strdup( ml->sml_desc->ad_cname.bv_val );
+               } else {
+                       modp->mod_type = slapi_ch_strdup( ml->sml_type.bv_val );
+               }
 
                if ( ml->sml_values != NULL ) {
                        for( j = 0; ml->sml_values[j].bv_val != NULL; j++ )
@@ -2731,14 +2656,9 @@ LDAPMod **slapi_int_modifications2ldapmods( Modifications **pmodlist )
                        for( j = 0; ml->sml_values[j].bv_val != NULL; j++ ) {
                                modp->mod_bvalues[j] = (struct berval *)slapi_ch_malloc(
                                                sizeof(struct berval) );
-                               /* Take ownership of original values. */
-                               modp->mod_bvalues[j]->bv_len = ml->sml_values[j].bv_len;
-                               modp->mod_bvalues[j]->bv_val = ml->sml_values[j].bv_val;
-                               ml->sml_values[j].bv_len = 0;
-                               ml->sml_values[j].bv_val = NULL;
+                               ber_dupbv( modp->mod_bvalues[j], &ml->sml_values[j] );
                        }
                        modp->mod_bvalues[j] = NULL;
-                       slapi_ch_free( (void **)&ml->sml_values );
                } else {
                        modp->mod_bvalues = NULL;
                }
@@ -2747,9 +2667,6 @@ LDAPMod **slapi_int_modifications2ldapmods( Modifications **pmodlist )
 
        mods[i] = NULL;
 
-       slap_mods_free( modlist, 1 );
-       *pmodlist = NULL;
-
        return mods;
 }
 
@@ -3111,7 +3028,7 @@ int slapi_int_access_allowed( Operation *op,
                break;
         }
 
-       rc = slapi_int_get_plugins( op->o_bd, SLAPI_PLUGIN_ACL_ALLOW_ACCESS, (SLAPI_FUNC **)&tmpPlugin );
+       rc = slapi_int_get_plugins( frontendDB, SLAPI_PLUGIN_ACL_ALLOW_ACCESS, (SLAPI_FUNC **)&tmpPlugin );
        if ( rc != LDAP_SUCCESS || tmpPlugin == NULL ) {
                /* nothing to do; allowed access */
                return 1;