]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/slapi/slapi_pblock.c
Add missing break statement in switch for SLAPI_SEARCH_ATTRS handler
[openldap] / servers / slapd / slapi / slapi_pblock.c
index 1d6b4c06c2104b583d523f252779301d075a6692..7e5339741911a77708b864df243f71b3a6e8200d 100644 (file)
@@ -64,6 +64,8 @@ pblock_get_param_class( int param )
        case SLAPI_DB2LDIF_PRINTKEY:
        case SLAPI_LDIF2DB_REMOVEDUPVALS:
        case SLAPI_MANAGEDSAIT:
+       case SLAPI_X_MANAGEDIT:
+       case SLAPI_X_OPERATION_NO_SCHEMA_CHECK:
        case SLAPI_IS_REPLICATED_OPERATION:
        case SLAPI_X_CONN_IS_UDP:
        case SLAPI_X_CONN_SSF:
@@ -76,6 +78,7 @@ pblock_get_param_class( int param )
        case SLAPI_OPERATION_ID:
        case SLAPI_OPINITIATED_TIME:
        case SLAPI_ABANDON_MSGID:
+       case SLAPI_X_OPERATION_DELETE_GLUE_PARENT:
                return PBLOCK_CLASS_LONG_INTEGER;
                break;
 
@@ -420,6 +423,24 @@ pblock_set_default( Slapi_PBlock *pb, int param, void *value )
        return PBLOCK_SUCCESS;
 }
 
+static int
+pblock_be_call( Slapi_PBlock *pb, int (*bep)(Operation *) )
+{
+       BackendDB *be_orig;
+       Operation *op;
+       int rc;
+
+       PBLOCK_ASSERT_OP( pb, 0 );
+       op = pb->pb_op;
+
+       be_orig = op->o_bd;
+       op->o_bd = select_backend( &op->o_req_ndn, 0, 0 );
+       rc = (*bep)( op );
+       op->o_bd = be_orig;
+
+       return rc;
+}
+
 static int 
 pblock_get( Slapi_PBlock *pb, int param, void **value ) 
 {
@@ -443,18 +464,30 @@ pblock_get( Slapi_PBlock *pb, int param, void **value )
                PBLOCK_ASSERT_OP( pb, 0 );
                *((ber_tag_t *)value) = pb->pb_op->o_tag;
                break;
+       case SLAPI_X_OPERATION_DELETE_GLUE_PARENT:
+               PBLOCK_ASSERT_OP( pb, 0 );
+               *((ber_tag_t *)value) = pb->pb_op->o_delete_glue_parent;
+               break;
+       case SLAPI_X_OPERATION_NO_SCHEMA_CHECK:
+               PBLOCK_ASSERT_OP( pb, 0 );
+               *((int *)value) = get_no_schema_check( pb->pb_op );
+               break;
        case SLAPI_REQCONTROLS:
                PBLOCK_ASSERT_OP( pb, 0 );
                *((LDAPControl ***)value) = pb->pb_op->o_ctrls;
                break;
        case SLAPI_REQUESTOR_DN:
                PBLOCK_ASSERT_OP( pb, 0 );
-               *((char **)value) = pb->pb_op->o_ndn.bv_val;
+               *((char **)value) = pb->pb_op->o_dn.bv_val;
                break;
        case SLAPI_MANAGEDSAIT:
                PBLOCK_ASSERT_OP( pb, 0 );
                *((int *)value) = get_manageDSAit( pb->pb_op );
                break;
+       case SLAPI_X_MANAGEDIT:
+               PBLOCK_ASSERT_OP( pb, 0 );
+               *((int *)value) = get_manageDIT( pb->pb_op );
+               break;
        case SLAPI_BACKEND:
                PBLOCK_ASSERT_OP( pb, 0 );
                *((BackendDB **)value) = pb->pb_op->o_bd;
@@ -482,15 +515,13 @@ pblock_get( Slapi_PBlock *pb, int param, void **value )
                break;
        case SLAPI_TARGET_DN:
                PBLOCK_ASSERT_OP( pb, 0 );
-               *((char **)value) = pb->pb_op->o_req_ndn.bv_val;
+               *((char **)value) = pb->pb_op->o_req_dn.bv_val;
                break;
        case SLAPI_REQUESTOR_ISROOT:
-               PBLOCK_ASSERT_OP( pb, 0 );
-               *((int *)value) = be_isroot( pb->pb_op );
+               *((int *)value) = pblock_be_call( pb, be_isroot );
                break;
        case SLAPI_IS_REPLICATED_OPERATION:
-               PBLOCK_ASSERT_OP( pb, 0 );
-               *((int *)value) = be_isupdate( pb->pb_op );
+               *((int *)value) = pblock_be_call( pb, be_slurp_update );
                break;
        case SLAPI_CONN_AUTHTYPE:
        case SLAPI_CONN_AUTHMETHOD: /* XXX should return SASL mech */
@@ -549,13 +580,16 @@ pblock_get( Slapi_PBlock *pb, int param, void **value )
                break;
        case SLAPI_RESULT_CODE:
        case SLAPI_PLUGIN_INTOP_RESULT:
-               *((int *)value) = pb->pb_rs.sr_err;
+               PBLOCK_ASSERT_OP( pb, 0 );
+               *((int *)value) = pb->pb_rs->sr_err;
                break;
         case SLAPI_RESULT_TEXT:
-               *((const char **)value) = pb->pb_rs.sr_text;
+               PBLOCK_ASSERT_OP( pb, 0 );
+               *((const char **)value) = pb->pb_rs->sr_text;
                break;
         case SLAPI_RESULT_MATCHED:
-               *((const char **)value) = pb->pb_rs.sr_matched;
+               PBLOCK_ASSERT_OP( pb, 0 );
+               *((const char **)value) = pb->pb_rs->sr_matched;
                break;
        case SLAPI_ADD_ENTRY:
                PBLOCK_ASSERT_OP( pb, 0 );
@@ -573,7 +607,7 @@ pblock_get( Slapi_PBlock *pb, int param, void **value )
                                rc = PBLOCK_ERROR;
                                break;
                        }
-                       mods = slapi_int_modifications2ldapmods( &pb->pb_op->orm_modlist, NULL );
+                       mods = slapi_int_modifications2ldapmods( &pb->pb_op->orm_modlist );
                        pblock_set_default( pb, param, (void *)mods );
                }
                *((LDAPMod ***)value) = mods;
@@ -655,7 +689,8 @@ pblock_get( Slapi_PBlock *pb, int param, void **value )
                        attrs = anlist2charray_x( pb->pb_op->ors_attrs, 0, pb->pb_op->o_tmpmemctx );
                        pblock_set_default( pb, param, (void *)attrs );
                }
-               *((char ***)attrs) = attrs;
+               *((char ***)value) = attrs;
+               break;
        }
        case SLAPI_SEARCH_ATTRSONLY:
                PBLOCK_ASSERT_OP( pb, 0 );
@@ -665,10 +700,12 @@ pblock_get( Slapi_PBlock *pb, int param, void **value )
                        *((int *)value) = 0;
                break;
        case SLAPI_SEARCH_RESULT_ENTRY:
-               *((Slapi_Entry **)value) = pb->pb_rs.sr_entry;
+               PBLOCK_ASSERT_OP( pb, 0 );
+               *((Slapi_Entry **)value) = pb->pb_rs->sr_entry;
                break;
        case SLAPI_BIND_RET_SASLCREDS:
-               *((struct berval **)value) = pb->pb_rs.sr_sasldata;
+               PBLOCK_ASSERT_OP( pb, 0 );
+               *((struct berval **)value) = pb->pb_rs->sr_sasldata;
                break;
        case SLAPI_EXT_OP_REQ_OID:
                *((const char **)value) = pb->pb_op->ore_reqoid.bv_val;
@@ -677,10 +714,12 @@ pblock_get( Slapi_PBlock *pb, int param, void **value )
                *((struct berval **)value) = pb->pb_op->ore_reqdata;
                break;
        case SLAPI_EXT_OP_RET_OID:
-               *((const char **)value) = pb->pb_rs.sr_rspoid;
+               PBLOCK_ASSERT_OP( pb, 0 );
+               *((const char **)value) = pb->pb_rs->sr_rspoid;
                break;
        case SLAPI_EXT_OP_RET_VALUE:
-               *((struct berval **)value) = pb->pb_rs.sr_rspdata;
+               PBLOCK_ASSERT_OP( pb, 0 );
+               *((struct berval **)value) = pb->pb_rs->sr_rspdata;
                break;
        case SLAPI_BIND_METHOD:
                if ( pb->pb_op->o_tag == LDAP_REQ_BIND )
@@ -739,7 +778,8 @@ pblock_add_control( Slapi_PBlock *pb, LDAPControl *control )
 
        controls = (LDAPControl **)slapi_ch_realloc( (char *)controls,
                ( i + 2 ) * sizeof(LDAPControl *));
-       controls[i] = control;
+       controls[i++] = slapi_dup_control( control );
+       controls[i] = NULL;
 
        return pblock_set_default( pb, SLAPI_RESCONTROLS, (void *)controls );
 }
@@ -759,7 +799,7 @@ pblock_set_dn( void *value, struct berval *dn, struct berval *ndn, void *memctx
        }
 
        bv.bv_val = (char *)value;
-       bv.bv_len = strlen( bv.bv_val );
+       bv.bv_len = ( value != NULL ) ? strlen( bv.bv_val ) : 0;
 
        return dnPrettyNormal( NULL, &bv, dn, ndn, memctx );
 }
@@ -787,6 +827,14 @@ pblock_set( Slapi_PBlock *pb, int param, void *value )
                PBLOCK_ASSERT_OP( pb, 0 );
                pb->pb_op->o_tag = *((ber_tag_t *)value);
                break;
+       case SLAPI_X_OPERATION_DELETE_GLUE_PARENT:
+               PBLOCK_ASSERT_OP( pb, 0 );
+               pb->pb_op->o_delete_glue_parent = *((int *)value);
+               break;
+       case SLAPI_X_OPERATION_NO_SCHEMA_CHECK:
+               PBLOCK_ASSERT_OP( pb, 0 );
+               pb->pb_op->o_no_schema_check = *((int *)value);
+               break;
        case SLAPI_REQCONTROLS:
                PBLOCK_ASSERT_OP( pb, 0 );
                pb->pb_op->o_ctrls = (LDAPControl **)value;
@@ -795,7 +843,7 @@ pblock_set( Slapi_PBlock *pb, int param, void *value )
                LDAPControl **ctrls = NULL;
 
                pblock_get_default( pb, param, (void **)&ctrls );
-               if ( ctrls == NULL ) {
+               if ( ctrls != NULL ) {
                        /* free old ones first */
                        ldap_controls_free( ctrls );
                }
@@ -814,6 +862,10 @@ pblock_set( Slapi_PBlock *pb, int param, void *value )
                PBLOCK_ASSERT_OP( pb, 0 );
                pb->pb_op->o_managedsait = *((int *)value);
                break;
+       case SLAPI_X_MANAGEDIT:
+               PBLOCK_ASSERT_OP( pb, 0 );
+               pb->pb_op->o_managedit = *((int *)value);
+               break;
        case SLAPI_BACKEND:
                PBLOCK_ASSERT_OP( pb, 0 );
                pb->pb_op->o_bd = (BackendDB *)value;
@@ -851,25 +903,28 @@ pblock_set( Slapi_PBlock *pb, int param, void *value )
                break;
        case SLAPI_RESULT_CODE:
        case SLAPI_PLUGIN_INTOP_RESULT:
-               pb->pb_rs.sr_err = *((int *)value);
+               PBLOCK_ASSERT_OP( pb, 0 );
+               pb->pb_rs->sr_err = *((int *)value);
                break;
        case SLAPI_RESULT_TEXT:
+               PBLOCK_ASSERT_OP( pb, 0 );
                snprintf( pb->pb_textbuf, sizeof( pb->pb_textbuf ), "%s", (char *)value );
-               pb->pb_rs.sr_text = pb->pb_textbuf;
+               pb->pb_rs->sr_text = pb->pb_textbuf;
                break;
        case SLAPI_RESULT_MATCHED:
-               pb->pb_rs.sr_matched = (char *)value; /* XXX should dup? */
+               PBLOCK_ASSERT_OP( pb, 0 );
+               pb->pb_rs->sr_matched = (char *)value; /* XXX should dup? */
                break;
        case SLAPI_ADD_ENTRY:
                PBLOCK_ASSERT_OP( pb, 0 );
-               if ( pb->pb_op->o_tag == LDAP_REQ_ADD ) {
+               if ( pb->pb_op->o_tag == LDAP_REQ_ADD )
                        pb->pb_op->ora_e = (Slapi_Entry *)value;
-               } else {
+               else
                        rc = PBLOCK_ERROR;
-               }
                break;
        case SLAPI_MODIFY_MODS: {
                Modifications **mlp;
+               Modifications *newmods;
 
                PBLOCK_ASSERT_OP( pb, 0 );
                rc = pblock_set_default( pb, param, value );
@@ -885,14 +940,11 @@ pblock_set( Slapi_PBlock *pb, int param, void *value )
                        break;
                }
 
-               if ( *mlp != NULL ) {
-                       if ( pb->pb_intop )
-                               slapi_int_mods_free( *mlp ); /* caller owns values */
-                       else
-                               slap_mods_free( *mlp );  /* we own values */
-                       *mlp = NULL;
+               newmods = slapi_int_ldapmods2modifications( (LDAPMod **)value );
+               if ( newmods != NULL ) {
+                       slap_mods_free( *mlp, 1 );
+                       *mlp = newmods;
                }
-               *mlp = slapi_int_ldapmods2modifications( (LDAPMod **)value, NULL );
                break;
        }
        case SLAPI_MODRDN_NEWRDN:
@@ -900,7 +952,8 @@ pblock_set( Slapi_PBlock *pb, int param, void *value )
                PBLOCK_VALIDATE_IS_INTOP( pb );
                if ( pb->pb_op->o_tag == LDAP_REQ_MODRDN ) {
                        rc = pblock_set_dn( value, &pb->pb_op->orr_newrdn, &pb->pb_op->orr_nnewrdn, pb->pb_op->o_tmpmemctx );
-                       if ( rc == LDAP_SUCCESS ) rc = rdn_validate( &pb->pb_op->orr_nnewrdn );
+                       if ( rc == LDAP_SUCCESS )
+                               rc = rdn_validate( &pb->pb_op->orr_nnewrdn );
                } else {
                        rc = PBLOCK_ERROR;
                }
@@ -1039,7 +1092,7 @@ pblock_set( Slapi_PBlock *pb, int param, void *value )
                                an[i].an_oc_exclude = 0;
                                an[i].an_name.bv_val = attrs[i];
                                an[i].an_name.bv_len = strlen( attrs[i] );
-                               slap_bv2ad( &an[i].an_name, &an[i].an_desc, &pb->pb_rs.sr_text );
+                               slap_bv2ad( &an[i].an_name, &an[i].an_desc, &pb->pb_rs->sr_text );
                        }
                        an[i].an_name.bv_val = NULL;
                        an[i].an_name.bv_len = 0;
@@ -1058,10 +1111,11 @@ pblock_set( Slapi_PBlock *pb, int param, void *value )
                break;
        case SLAPI_SEARCH_RESULT_ENTRY:
                PBLOCK_ASSERT_OP( pb, 0 );
-               pb->pb_rs.sr_entry = (Slapi_Entry *)value;
+               pb->pb_rs->sr_entry = (Slapi_Entry *)value;
                break;
        case SLAPI_BIND_RET_SASLCREDS:
-               pb->pb_rs.sr_sasldata = (struct berval *)value;
+               PBLOCK_ASSERT_OP( pb, 0 );
+               pb->pb_rs->sr_sasldata = (struct berval *)value;
                break;
        case SLAPI_EXT_OP_REQ_OID:
                PBLOCK_ASSERT_OP( pb, 0 );
@@ -1084,10 +1138,12 @@ pblock_set( Slapi_PBlock *pb, int param, void *value )
                        rc = PBLOCK_ERROR;
                break;
        case SLAPI_EXT_OP_RET_OID:
-               pb->pb_rs.sr_rspoid = (char *)value;
+               PBLOCK_ASSERT_OP( pb, 0 );
+               pb->pb_rs->sr_rspoid = (char *)value;
                break;
        case SLAPI_EXT_OP_RET_VALUE:
-               pb->pb_rs.sr_rspdata = (struct berval *)value;
+               PBLOCK_ASSERT_OP( pb, 0 );
+               pb->pb_rs->sr_rspdata = (struct berval *)value;
                break;
        case SLAPI_BIND_METHOD:
                PBLOCK_ASSERT_OP( pb, 0 );
@@ -1210,6 +1266,7 @@ slapi_pblock_new(void)
                pb->pb_nParams = 1;
                pb->pb_conn = NULL;
                pb->pb_op = NULL;
+               pb->pb_rs = NULL;
                pb->pb_intop = 0;
        }
        return pb;
@@ -1233,8 +1290,7 @@ pblock_destroy( Slapi_PBlock *pb )
                slapi_int_connection_done_pb( pb );
        } else {
                pblock_get_default( pb, SLAPI_MODIFY_MODS, (void **)&mods );
-               if ( mods != NULL )
-                       slapi_int_free_ldapmods( mods );
+               ldap_mods_free( mods, 1 );
 
                pblock_get_default( pb, SLAPI_SEARCH_ATTRS, (void **)&attrs );
                if ( attrs != NULL )