From: Ondřej Kuzník Date: Tue, 6 Jun 2023 10:52:34 +0000 (+0100) Subject: ITS#10013 Introduce slap_add_ctrl, changing slap_add_ctrls signature X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c1f00a8af686f6fbc4c52b665c9f5433b5036d5b;p=thirdparty%2Fopenldap.git ITS#10013 Introduce slap_add_ctrl, changing slap_add_ctrls signature --- diff --git a/contrib/slapd-modules/dupent/dupent.c b/contrib/slapd-modules/dupent/dupent.c index 89ad622ecd..76af313e94 100644 --- a/contrib/slapd-modules/dupent/dupent.c +++ b/contrib/slapd-modules/dupent/dupent.c @@ -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; diff --git a/contrib/slapd-modules/noopsrch/noopsrch.c b/contrib/slapd-modules/noopsrch/noopsrch.c index 24f0f5363b..6e0c35b010 100644 --- a/contrib/slapd-modules/noopsrch/noopsrch.c +++ b/contrib/slapd-modules/noopsrch/noopsrch.c @@ -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; } diff --git a/servers/slapd/back-mdb/search.c b/servers/slapd/back-mdb/search.c index a3d629c73a..927a3204ef 100644 --- a/servers/slapd/back-mdb/search.c +++ b/servers/slapd/back-mdb/search.c @@ -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 ); diff --git a/servers/slapd/back-wt/search.c b/servers/slapd/back-wt/search.c index 8a313b3222..41d031a4f1 100644 --- a/servers/slapd/back-wt/search.c +++ b/servers/slapd/back-wt/search.c @@ -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 ); diff --git a/servers/slapd/controls.c b/servers/slapd/controls.c index 966b611423..54b28ecb98 100644 --- a/servers/slapd/controls.c +++ b/servers/slapd/controls.c @@ -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, diff --git a/servers/slapd/overlays/deref.c b/servers/slapd/overlays/deref.c index 93b7f69da8..51f7625d2e 100644 --- a/servers/slapd/overlays/deref.c +++ b/servers/slapd/overlays/deref.c @@ -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; diff --git a/servers/slapd/overlays/ppolicy.c b/servers/slapd/overlays/ppolicy.c index 8c7088ea58..11145e3ad7 100644 --- a/servers/slapd/overlays/ppolicy.c +++ b/servers/slapd/overlays/ppolicy.c @@ -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; diff --git a/servers/slapd/overlays/sssvlv.c b/servers/slapd/overlays/sssvlv.c index 828782afa0..92255dd7a6 100644 --- a/servers/slapd/overlays/sssvlv.c +++ b/servers/slapd/overlays/sssvlv.c @@ -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"; diff --git a/servers/slapd/proto-slap.h b/servers/slapd/proto-slap.h index 89a1e02262..d9dfb85bc8 100644 --- a/servers/slapd/proto-slap.h +++ b/servers/slapd/proto-slap.h @@ -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,