]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/overlays/deref.c
happy belated New Year
[openldap] / servers / slapd / overlays / deref.c
index 8c42170299fe5adeeef3a7d7ddb9c21a8235b81b..d3e29921f1b05e9580ce1cb55d23902e712f3f63 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2008 The OpenLDAP Foundation.
+ * Copyright 1998-2010 The OpenLDAP Foundation.
  * Portions Copyright 2008 Pierangelo Masarati.
  * All rights reserved.
  *
@@ -192,7 +192,7 @@ deref_parseCtrl (
                ds = (DerefSpec *)op->o_tmpcalloc( 1,
                        sizeof(DerefSpec) + sizeof(AttributeDescription *)*(cnt + 1),
                        op->o_tmpmemctx );
-               ds->ds_attributes = (AttributeDescription **)&ds[1];
+               ds->ds_attributes = (AttributeDescription **)&ds[ 1 ];
                ds->ds_nattrs = cnt;
 
                rc = slap_bv2ad( &derefAttr, &ds->ds_derefAttr, &text );
@@ -262,6 +262,20 @@ justcleanup:;
        return rs->sr_err;
 }
 
+static int
+deref_cleanup( Operation *op, SlapReply *rs )
+{
+       if ( rs->sr_type == REP_RESULT || rs->sr_err == SLAPD_ABANDON ) {
+               op->o_tmpfree( op->o_callback, op->o_tmpmemctx );
+               op->o_callback = NULL;
+
+               op->o_tmpfree( op->o_ctrlderef, op->o_tmpmemctx );
+               op->o_ctrlderef = NULL;
+       }
+
+       return SLAP_CB_CONTINUE;
+}
+
 static int
 deref_response( Operation *op, SlapReply *rs )
 {
@@ -273,20 +287,17 @@ deref_response( Operation *op, SlapReply *rs )
                deref_cb_t *dc = (deref_cb_t *)op->o_callback->sc_private;
                DerefSpec *ds;
                DerefRes *dr, *drhead = NULL, **drp = &drhead;
-               BackendInfo *bi = op->o_bd->bd_info;
                struct berval bv = BER_BVNULL;
                int nDerefRes = 0, nDerefVals = 0, nAttrs = 0, nVals = 0;
                struct berval ctrlval;
-               LDAPControl *ctrl, **ctrlsp;
+               LDAPControl *ctrl, *ctrlsp[2];
                AccessControlState acl_state = ACL_STATE_INIT;
                static char dummy = '\0';
                Entry *ebase;
                int i;
 
-               op->o_bd->bd_info = (BackendInfo *)dc->dc_on->on_info;
                rc = overlay_entry_get_ov( op, &rs->sr_entry->e_nname, NULL, NULL, 0, &ebase, dc->dc_on );
                if ( rc != LDAP_SUCCESS || ebase == NULL ) {
-                       op->o_bd->bd_info = bi;
                        return SLAP_CB_CONTINUE;
                }
 
@@ -328,8 +339,8 @@ deref_response( Operation *op, SlapReply *rs )
                                                continue;
                                        }
 
-                                       dv[i].dv_derefSpecVal = a->a_vals[ i ];
-                                       bv.bv_len += dv[i].dv_derefSpecVal.bv_len;
+                                       ber_dupbv_x( &dv[ i ].dv_derefSpecVal, &a->a_vals[ i ], op->o_tmpmemctx );
+                                       bv.bv_len += dv[ i ].dv_derefSpecVal.bv_len;
                                        nVals++;
                                        nDerefVals++;
 
@@ -388,7 +399,6 @@ deref_response( Operation *op, SlapReply *rs )
                        }
                }
                overlay_entry_release_ov( op, ebase, 0, dc->dc_on );
-               op->o_bd->bd_info = bi;
 
                if ( drhead == NULL ) {
                        return SLAP_CB_CONTINUE;
@@ -416,6 +426,7 @@ deref_response( Operation *op, SlapReply *rs )
                                rc = ber_printf( ber, "{OO" /*}*/,
                                        &dr->dr_spec.ds_derefAttr->ad_cname,
                                        &dr->dr_vals[ i ].dv_derefSpecVal );
+                               op->o_tmpfree( dr->dr_vals[ i ].dv_derefSpecVal.bv_val, op->o_tmpmemctx );
                                for ( j = 0; j < dr->dr_spec.ds_nattrs; j++ ) {
                                        if ( dr->dr_vals[ i ].dv_attrVals[ j ] != NULL ) {
                                                if ( first ) {
@@ -455,31 +466,14 @@ deref_response( Operation *op, SlapReply *rs )
                ctrl->ldctl_oid = LDAP_CONTROL_X_DEREF;
                ctrl->ldctl_iscritical = 0;
                ctrl->ldctl_value.bv_len = ctrlval.bv_len;
-               lutil_strncopy( ctrl->ldctl_value.bv_val, ctrlval.bv_val, ctrlval.bv_len );
+               AC_MEMCPY( ctrl->ldctl_value.bv_val, ctrlval.bv_val, ctrlval.bv_len );
                ctrl->ldctl_value.bv_val[ ctrl->ldctl_value.bv_len ] = '\0';
 
                ber_free_buf( ber );
 
-               i = 0;
-               if ( rs->sr_ctrls ) {
-                       for ( ; rs->sr_ctrls[ i ] != NULL; i++ )
-                               /* count'em */ ;
-               }
-               i += 2;
-               ctrlsp = op->o_tmpcalloc( i, sizeof(LDAPControl *), op->o_tmpmemctx );
-               i = 0;
-               if ( rs->sr_ctrls != NULL ) {
-                       for ( ; rs->sr_ctrls[ i ] != NULL; i++ ) {
-                               ctrlsp[ i ] = rs->sr_ctrls[ i ];
-                       }
-               }
-               ctrlsp[ i++ ] = ctrl;
-               ctrlsp[ i++ ] = NULL;
-               if ( rs->sr_flags & REP_CTRLS_MUSTBEFREED ) {
-                       op->o_tmpfree( rs->sr_ctrls, op->o_tmpmemctx );
-               }
-               rs->sr_ctrls = ctrlsp;
-               rs->sr_flags |= REP_CTRLS_MUSTBEFREED;
+               ctrlsp[0] = ctrl;
+               ctrlsp[1] = NULL;
+               slap_add_ctrls( op, rs, ctrlsp );
 
                rc = SLAP_CB_CONTINUE;
 
@@ -490,23 +484,12 @@ cleanup:;
                        op->o_tmpfree( drhead, op->o_tmpmemctx );
                        drhead = drnext;
                }
-       }
-
-       return rc;
-}
-
-static int
-deref_cleanup( Operation *op, SlapReply *rs )
-{
-       if ( rs->sr_type == REP_RESULT || rs->sr_err == SLAPD_ABANDON ) {
-               op->o_tmpfree( op->o_callback, op->o_tmpmemctx );
-               op->o_callback = NULL;
 
-               op->o_tmpfree( op->o_ctrlderef, op->o_tmpmemctx );
-               op->o_ctrlderef = NULL;
+       } else if ( rs->sr_type == REP_RESULT ) {
+               rc = deref_cleanup( op, rs );
        }
 
-       return SLAP_CB_CONTINUE;
+       return rc;
 }
 
 static int
@@ -544,7 +527,7 @@ deref_initialize(void)
        if ( rc != LDAP_SUCCESS ) {
                Debug( LDAP_DEBUG_ANY,
                        "deref_init: Failed to register control (%d)\n",
-               rc, 0, 0 );
+                       rc, 0, 0 );
                return -1;
        }