]> git.ipfire.org Git - thirdparty/openldap.git/commitdiff
ITS#10013 Introduce slap_add_ctrl, changing slap_add_ctrls signature
authorOndřej Kuzník <ondra@mistotebe.net>
Tue, 6 Jun 2023 10:52:34 +0000 (11:52 +0100)
committerQuanah Gibson-Mount <quanah@openldap.org>
Tue, 21 Nov 2023 17:21:52 +0000 (17:21 +0000)
contrib/slapd-modules/dupent/dupent.c
contrib/slapd-modules/noopsrch/noopsrch.c
servers/slapd/back-mdb/search.c
servers/slapd/back-wt/search.c
servers/slapd/controls.c
servers/slapd/overlays/deref.c
servers/slapd/overlays/ppolicy.c
servers/slapd/overlays/sssvlv.c
servers/slapd/proto-slap.h

index 89ad622ecd5c59e8ae987c6e1b0e31b4c6c3e457..76af313e94b02a49fa1dc965193e78f002d09689 100644 (file)
@@ -247,7 +247,7 @@ dupent_response_done( Operation *op, SlapReply *rs )
        BerElementBuffer        berbuf;
        BerElement                      *ber = (BerElement *) &berbuf;
        struct berval           ctrlval;
-       LDAPControl                     *ctrl, *ctrlsp[2];
+       LDAPControl                     *ctrl;
 
        ber_init2( ber, NULL, LBER_USE_DER );
 
@@ -281,9 +281,7 @@ dupent_response_done( Operation *op, SlapReply *rs )
 
        ber_free_buf( ber );
 
-       ctrlsp[0] = ctrl;
-       ctrlsp[1] = NULL;
-       slap_add_ctrls( op, rs, ctrlsp );
+       slap_add_ctrl( op, rs, ctrl );
 
        return SLAP_CB_CONTINUE;
 }
@@ -300,7 +298,7 @@ dupent_response_entry_1level(
        int i, rc = LDAP_SUCCESS;
 
        for ( i = 0; i < valnum[level].ap->a_numvals; i++ ) {
-               LDAPControl     *ctrl = NULL, *ctrlsp[2];
+               LDAPControl     *ctrl;
 
                valnum[level].a.a_vals[0] = valnum[level].ap->a_vals[i];
                if ( valnum[level].ap->a_nvals != valnum[level].ap->a_vals ) {
@@ -325,9 +323,7 @@ dupent_response_entry_1level(
                ctrl->ldctl_oid = LDAP_CONTROL_DUPENT_ENTRY;
                ctrl->ldctl_iscritical = 0;
 
-               ctrlsp[0] = ctrl;
-               ctrlsp[1] = NULL;
-               slap_add_ctrls( op, rs, ctrlsp );
+               slap_add_ctrl( op, rs, ctrl );
 
                /* do the real send */
                rs->sr_entry = e;
index 24f0f5363b344d274e3d0cdb5079f5059a0aa5d2..6e0c35b0100606c0167863ec899b1fd81164a77f 100644 (file)
@@ -102,7 +102,7 @@ noopsrch_response( Operation *op, SlapReply *rs )
                BerElementBuffer        berbuf;
                BerElement                      *ber = (BerElement *) &berbuf;
                struct berval           ctrlval;
-               LDAPControl                     *ctrl, *ctrlsp[2];
+               LDAPControl                     *ctrl;
                int                                     rc = rs->sr_err;
 
                if ( nc->nc_save_slimit >= 0 && nc->nc_nentries >= nc->nc_save_slimit ) {
@@ -136,9 +136,7 @@ noopsrch_response( Operation *op, SlapReply *rs )
 
                ber_free_buf( ber );
 
-               ctrlsp[0] = ctrl;
-               ctrlsp[1] = NULL;
-               slap_add_ctrls( op, rs, ctrlsp );
+               slap_add_ctrl( op, rs, ctrl );
        }
        return SLAP_CB_CONTINUE;
 }
index a3d629c73ad539a39808d64e855e0e238f118e4c..927a3204ef71560a1daa60cd12e6d019a94f3a6f 100644 (file)
@@ -1492,7 +1492,7 @@ send_paged_response(
        ID              *lastid,
        int             tentries )
 {
-       LDAPControl     *ctrls[2];
+       LDAPControl     *ctrl;
        BerElementBuffer berbuf;
        BerElement      *ber = (BerElement *)&berbuf;
        PagedResultsCookie respcookie;
@@ -1502,8 +1502,6 @@ send_paged_response(
                "send_paged_response: lastid=0x%08lx nentries=%d\n", 
                lastid ? *lastid : 0, rs->sr_nentries );
 
-       ctrls[1] = NULL;
-
        ber_init2( ber, NULL, LBER_USE_DER );
 
        if ( lastid ) {
@@ -1524,15 +1522,15 @@ send_paged_response(
        /* return size of 0 -- no estimate */
        ber_printf( ber, "{iO}", 0, &cookie ); 
 
-       ctrls[0] = op->o_tmpalloc( sizeof(LDAPControl), op->o_tmpmemctx );
-       if ( ber_flatten2( ber, &ctrls[0]->ldctl_value, 0 ) == -1 ) {
+       ctrl = op->o_tmpalloc( sizeof(LDAPControl), op->o_tmpmemctx );
+       if ( ber_flatten2( ber, &ctrl->ldctl_value, 0 ) == -1 ) {
                goto done;
        }
 
-       ctrls[0]->ldctl_oid = LDAP_CONTROL_PAGEDRESULTS;
-       ctrls[0]->ldctl_iscritical = 0;
+       ctrl->ldctl_oid = LDAP_CONTROL_PAGEDRESULTS;
+       ctrl->ldctl_iscritical = 0;
 
-       slap_add_ctrls( op, rs, ctrls );
+       slap_add_ctrl( op, rs, ctrl );
        rs->sr_err = LDAP_SUCCESS;
        send_ldap_result( op, rs );
 
index 8a313b3222115c9e80816e32c13c3ea07adc2288..41d031a4f1d495a831289cdebb5f2bf92847cd27 100644 (file)
@@ -273,7 +273,7 @@ send_paged_response(
        ID      *lastid,
        int     tentries )
 {
-       LDAPControl *ctrls[2];
+       LDAPControl *ctrl;
        BerElementBuffer berbuf;
        BerElement  *ber = (BerElement *)&berbuf;
        PagedResultsCookie respcookie;
@@ -283,8 +283,6 @@ send_paged_response(
                  "send_paged_response: lastid=0x%08lx nentries=%d\n",
                  lastid ? *lastid : 0, rs->sr_nentries );
 
-       ctrls[1] = NULL;
-
        ber_init2( ber, NULL, LBER_USE_DER );
 
        if ( lastid ) {
@@ -305,15 +303,15 @@ send_paged_response(
        /* return size of 0 -- no estimate */
        ber_printf( ber, "{iO}", 0, &cookie );
 
-       ctrls[0] = op->o_tmpalloc( sizeof(LDAPControl), op->o_tmpmemctx );
-       if ( ber_flatten2( ber, &ctrls[0]->ldctl_value, 0 ) == -1 ) {
+       ctrl = op->o_tmpalloc( sizeof(LDAPControl), op->o_tmpmemctx );
+       if ( ber_flatten2( ber, &ctrl->ldctl_value, 0 ) == -1 ) {
                goto done;
        }
 
-       ctrls[0]->ldctl_oid = LDAP_CONTROL_PAGEDRESULTS;
-       ctrls[0]->ldctl_iscritical = 0;
+       ctrl->ldctl_oid = LDAP_CONTROL_PAGEDRESULTS;
+       ctrl->ldctl_iscritical = 0;
 
-       slap_add_ctrls( op, rs, ctrls );
+       slap_add_ctrl( op, rs, ctrl );
        rs->sr_err = LDAP_SUCCESS;
        send_ldap_result( op, rs );
 
index 966b6114236e60dabd38001c487ad6cc85c0550b..54b28ecb984c7b8655005e9ee347ea3b3dd011cd 100644 (file)
@@ -643,7 +643,8 @@ void slap_free_ctrls(
 int slap_add_ctrls(
        Operation *op,
        SlapReply *rs,
-       LDAPControl **ctrls )
+       LDAPControl **ctrls,
+       int numctrls )
 {
        int i = 0, j;
        LDAPControl **ctrlsp;
@@ -652,7 +653,12 @@ int slap_add_ctrls(
                for ( ; rs->sr_ctrls[ i ]; i++ ) ;
        }
 
-       for ( j=0; ctrls[j]; j++ ) ;
+       if ( numctrls ) {
+               j = numctrls;
+       } else {
+               for ( j=0; ctrls[j]; j++ ) ;
+               numctrls = j;
+       }
 
        ctrlsp = op->o_tmpalloc(( i+j+1 )*sizeof(LDAPControl *), op->o_tmpmemctx );
        i = 0;
@@ -660,7 +666,7 @@ int slap_add_ctrls(
                for ( ; rs->sr_ctrls[i]; i++ )
                        ctrlsp[i] = rs->sr_ctrls[i];
        }
-       for ( j=0; ctrls[j]; j++)
+       for ( j=0; j < numctrls; j++)
                ctrlsp[i++] = ctrls[j];
        ctrlsp[i] = NULL;
 
@@ -671,6 +677,15 @@ int slap_add_ctrls(
        return i;
 }
 
+int
+slap_add_ctrl(
+       Operation *op,
+       SlapReply *rs,
+       LDAPControl *ctrl )
+{
+       return slap_add_ctrls( op, rs, &ctrl, 1 );
+}
+
 int slap_parse_ctrl(
        Operation *op,
        SlapReply *rs,
index 93b7f69da80d9cab36d7b6e6b668b60e751f5a41..51f7625d2e3fd89de0e36b01dc6f82b2f1705b58 100644 (file)
@@ -292,7 +292,7 @@ deref_response( Operation *op, SlapReply *rs )
                struct berval bv = BER_BVNULL;
                int nDerefRes = 0, nDerefVals = 0, nAttrs = 0, nVals = 0;
                struct berval ctrlval;
-               LDAPControl *ctrl, *ctrlsp[2];
+               LDAPControl *ctrl;
                AccessControlState acl_state = ACL_STATE_INIT;
                static char dummy = '\0';
                Entry *ebase;
@@ -473,9 +473,7 @@ deref_response( Operation *op, SlapReply *rs )
 
                ber_free_buf( ber );
 
-               ctrlsp[0] = ctrl;
-               ctrlsp[1] = NULL;
-               slap_add_ctrls( op, rs, ctrlsp );
+               slap_add_ctrl( op, rs, ctrl );
 
                rc = SLAP_CB_CONTINUE;
 
index 8c7088ea589ce618a3dd9d03df432cd2ed93bf24..11145e3ad78aa123f79997cc393da4f88cc9a8ab 100644 (file)
@@ -1997,7 +1997,7 @@ add_account_control(
 {
        BerElementBuffer berbuf;
        BerElement *ber = (BerElement *) &berbuf;
-       LDAPControl c = { 0 }, *cp = NULL, *ctrls[2] = { NULL, NULL };
+       LDAPControl c = { 0 }, *ctrl;
        int rc = -1;
 
        BER_BVZERO( &c.ldctl_value );
@@ -2022,20 +2022,18 @@ add_account_control(
                goto fail;
        }
 
-       cp = op->o_tmpalloc( sizeof( LDAPControl ) + c.ldctl_value.bv_len, op->o_tmpmemctx );
-       if ( !cp ) {
+       ctrl = op->o_tmpalloc( sizeof( LDAPControl ) + c.ldctl_value.bv_len, op->o_tmpmemctx );
+       if ( !ctrl ) {
                goto fail;
        }
 
-       cp->ldctl_oid = (char *)ppolicy_account_ctrl_oid;
-       cp->ldctl_iscritical = 0;
-       cp->ldctl_value.bv_val = (char *)&cp[1];
-       cp->ldctl_value.bv_len = c.ldctl_value.bv_len;
-       AC_MEMCPY( cp->ldctl_value.bv_val, c.ldctl_value.bv_val, c.ldctl_value.bv_len );
+       ctrl->ldctl_oid = (char *)ppolicy_account_ctrl_oid;
+       ctrl->ldctl_iscritical = 0;
+       ctrl->ldctl_value.bv_val = (char *)&ctrl[1];
+       ctrl->ldctl_value.bv_len = c.ldctl_value.bv_len;
+       AC_MEMCPY( ctrl->ldctl_value.bv_val, c.ldctl_value.bv_val, c.ldctl_value.bv_len );
 
-       /* TODO: ITS#10013 Use something like slap_add_ctrl when it exists */
-       ctrls[ 0 ] = cp;
-       slap_add_ctrls( op, rs, ctrls );
+       slap_add_ctrl( op, rs, ctrl );
 
        rc = LDAP_SUCCESS;
 fail:
@@ -2822,7 +2820,7 @@ ppolicy_bind_response( Operation *op, SlapReply *rs )
        char nowstr_usec[ LDAP_LUTIL_GENTIME_BUFSIZE+8 ];
        struct berval timestamp, timestamp_usec;
        BackendDB *be = op->o_bd;
-       LDAPControl *ctrls[2] = { NULL, NULL };
+       LDAPControl *ctrl = NULL;
        Entry *e;
 
        ldap_pvt_thread_mutex_lock( &pi->pwdFailureTime_mutex );
@@ -3195,16 +3193,16 @@ locked:
                if ( ppb->pErr == PP_accountLocked && !pi->use_lockout ) {
                        ppb->pErr = PP_noError;
                }
-               ctrls[0] = create_passcontrol( op, warn, ngut, ppb->pErr );
+               ctrl = create_passcontrol( op, warn, ngut, ppb->pErr );
        } else if ( pi->send_netscape_controls ) {
                if ( ppb->pErr != PP_noError || pwExpired ) {
-                       ctrls[0] = create_passexpiry( op, 1, 0 );
+                       ctrl = create_passexpiry( op, 1, 0 );
                } else if ( warn > 0 ) {
-                       ctrls[0] = create_passexpiry( op, 0, warn );
+                       ctrl = create_passexpiry( op, 0, warn );
                }
        }
-       if ( ctrls[0] ) {
-               slap_add_ctrls( op, rs, ctrls );
+       if ( ctrl ) {
+               slap_add_ctrl( op, rs, ctrl );
                op->o_callback->sc_cleanup = ppolicy_ctrls_cleanup;
        }
 out:
@@ -3318,9 +3316,9 @@ ppolicy_restrict(
                Debug( LDAP_DEBUG_TRACE,
                        "connection restricted to password changing only\n" );
                if ( send_ctrl ) {
-                       LDAPControl *ctrls[2] = { NULL, NULL };
-                       ctrls[0] = create_passcontrol( op, -1, -1, PP_changeAfterReset );
-                       slap_add_ctrls( op, rs, ctrls );
+                       LDAPControl *ctrl;
+                       ctrl = create_passcontrol( op, -1, -1, PP_changeAfterReset );
+                       slap_add_ctrl( op, rs, ctrl );
                }
                op->o_bd->bd_info = (BackendInfo *)on->on_info;
                send_ldap_error( op, rs, LDAP_INSUFFICIENT_ACCESS, 
@@ -3666,9 +3664,9 @@ ppolicy_add(
                                char *txt = errmsg.bv_val;
                                op->o_bd->bd_info = (BackendInfo *)on->on_info;
                                if ( send_ctrl ) {
-                                       LDAPControl *ctrls[2] = { NULL, NULL };
-                                       ctrls[0] = create_passcontrol( op, -1, -1, pErr );
-                                       slap_add_ctrls( op, rs, ctrls );
+                                       LDAPControl *ctrl;
+                                       ctrl = create_passcontrol( op, -1, -1, pErr );
+                                       slap_add_ctrl( op, rs, ctrl );
                                }
                                send_ldap_error( op, rs, rc, txt && txt[0] ? txt : "Password fails quality checking policy" );
                                if ( txt != errbuf ) {
@@ -3776,7 +3774,7 @@ ppolicy_modify( Operation *op, SlapReply *rs )
        struct berval           newpw = BER_BVNULL, oldpw = BER_BVNULL,
                                *bv, cr[2];
        LDAPPasswordPolicyError pErr = PP_noError;
-       LDAPControl             *ctrls[2] = { NULL, NULL };
+       LDAPControl             *ctrl = NULL;
        int                     is_pwdexop = 0, is_pwdadmin = 0;
        int got_del_grace = 0, got_del_lock = 0, got_pw = 0, got_del_fail = 0,
                got_del_success = 0;
@@ -4512,8 +4510,8 @@ return_results:
        op->o_bd->bd_info = (BackendInfo *)on->on_info;
        be_entry_release_r( op, e );
        if ( send_ctrl ) {
-               ctrls[0] = create_passcontrol( op, -1, -1, pErr );
-               slap_add_ctrls( op, rs, ctrls );
+               ctrl = create_passcontrol( op, -1, -1, pErr );
+               slap_add_ctrl( op, rs, ctrl );
                if ( is_pwdexop ) {
                        /* Retain controls for the actual response */
                        rs->sr_flags &= ~REP_CTRLS_MUSTBEFREED;
index 828782afa0cea16f79a7b332940566a9ff260694..92255dd7a64f6afae6fff69f2e11185d1f0d653b 100644 (file)
@@ -201,7 +201,7 @@ static int pack_vlv_response_control(
        Operation               *op,
        SlapReply               *rs,
        sort_op                 *so,
-       LDAPControl     **ctrlsp )
+       LDAPControl     **ctrlp )
 {
        LDAPControl                     *ctrl;
        BerElementBuffer        berbuf;
@@ -237,9 +237,9 @@ static int pack_vlv_response_control(
                ctrl->ldctl_value.bv_val = (char *)(ctrl+1);
                ctrl->ldctl_value.bv_len = bv.bv_len;
                AC_MEMCPY( ctrl->ldctl_value.bv_val, bv.bv_val, bv.bv_len );
-               ctrlsp[0] = ctrl;
+               *ctrlp = ctrl;
        } else {
-               ctrlsp[0] = NULL;
+               *ctrlp = NULL;
                rs->sr_err = LDAP_OTHER;
        }
 
@@ -451,7 +451,7 @@ static void send_list(
        int i, j, dir, rc;
        BackendDB *be;
        Entry *e;
-       LDAPControl *ctrls[2];
+       LDAPControl *ctrl;
 
        rs->sr_attrs = op->ors_attrs;
 
@@ -480,9 +480,8 @@ static void send_list(
                                if ( vc->vc_offset > so->so_nentries ) {
 range_err:
                                        so->so_vlv_rc = LDAP_VLV_RANGE_ERROR;
-                                       pack_vlv_response_control( op, rs, so, ctrls );
-                                       ctrls[1] = NULL;
-                                       slap_add_ctrls( op, rs, ctrls );
+                                       pack_vlv_response_control( op, rs, so, &ctrl );
+                                       slap_add_ctrl( op, rs, ctrl );
                                        rs->sr_err = LDAP_VLV_ERROR;
                                        return;
                                }
@@ -513,9 +512,8 @@ range_err:
                                mr->smr_syntax, mr, &vc->vc_value, &bv, op->o_tmpmemctx );
                        if ( rc ) {
                                so->so_vlv_rc = LDAP_INAPPROPRIATE_MATCHING;
-                               pack_vlv_response_control( op, rs, so, ctrls );
-                               ctrls[1] = NULL;
-                               slap_add_ctrls( op, rs, ctrls );
+                               pack_vlv_response_control( op, rs, so, &ctrl );
+                               slap_add_ctrl( op, rs, ctrl );
                                rs->sr_err = LDAP_VLV_ERROR;
                                return;
                        }
@@ -688,22 +686,22 @@ static void send_result(
        LDAPControl *ctrls[3];
        int rc, i = 0;
 
-       rc = pack_sss_response_control( op, rs, ctrls );
+       rc = pack_sss_response_control( op, rs, &ctrls[i] );
        if ( rc == LDAP_SUCCESS ) {
                i++;
                rc = -1;
                if ( so->so_paged > SLAP_CONTROL_IGNORED ) {
-                       rc = pack_pagedresult_response_control( op, rs, so, ctrls+1 );
+                       rc = pack_pagedresult_response_control( op, rs, so, &ctrls[i] );
                } else if ( so->so_vlv > SLAP_CONTROL_IGNORED ) {
-                       rc = pack_vlv_response_control( op, rs, so, ctrls+1 );
+                       rc = pack_vlv_response_control( op, rs, so, &ctrls[i] );
                }
                if ( rc == LDAP_SUCCESS )
                        i++;
        }
        ctrls[i] = NULL;
 
-       if ( ctrls[0] != NULL )
-               slap_add_ctrls( op, rs, ctrls );
+       if ( i )
+               slap_add_ctrls( op, rs, ctrls, i );
        send_ldap_result( op, rs );
 
        if ( so->so_tree == NULL ) {
@@ -818,16 +816,15 @@ static int sssvlv_op_search(
 
        if ( op->o_ctrlflag[sss_cid] <= SLAP_CONTROL_IGNORED ) {
                if ( op->o_ctrlflag[vlv_cid] > SLAP_CONTROL_IGNORED ) {
-                       LDAPControl *ctrls[2];
+                       LDAPControl *ctrl;
                        so2.so_vcontext = 0;
                        so2.so_vlv_target = 0;
                        so2.so_nentries = 0;
                        so2.so_vlv_rc = LDAP_VLV_SSS_MISSING;
                        so2.so_vlv = op->o_ctrlflag[vlv_cid];
-                       rc = pack_vlv_response_control( op, rs, &so2, ctrls );
+                       rc = pack_vlv_response_control( op, rs, &so2, &ctrl );
                        if ( rc == LDAP_SUCCESS ) {
-                               ctrls[1] = NULL;
-                               slap_add_ctrls( op, rs, ctrls );
+                               slap_add_ctrl( op, rs, ctrl );
                        }
                        rs->sr_err = LDAP_VLV_ERROR;
                        rs->sr_text = "Sort control is required with VLV";
index 89a1e02262de40461a2dd0dce3232f187b3d5515..d9dfb85bc897b4fef4a9d7f8039c136b06d2a607 100644 (file)
@@ -645,7 +645,12 @@ LDAP_SLAPD_F (void) slap_free_ctrls LDAP_P((
 LDAP_SLAPD_F (int) slap_add_ctrls LDAP_P((
        Operation *op,
        SlapReply *rs,
-       LDAPControl **ctrls ));
+       LDAPControl **ctrls,
+       int numctrls ));
+LDAP_SLAPD_F (int) slap_add_ctrl LDAP_P((
+       Operation *op,
+       SlapReply *rs,
+       LDAPControl *ctrl ));
 LDAP_SLAPD_F (int) slap_parse_ctrl LDAP_P((
        Operation *op,
        SlapReply *rs,