--- servers/slapd/overlays/syncprov.c 2007/05/19 12:12:24 1.189 +++ servers/slapd/overlays/syncprov.c 2007/09/23 02:40:17 1.198 @@ -1,4 +1,4 @@ -/* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.188 2007/05/18 21:54:27 hallvard Exp $ */ +/* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.197 2007/09/21 06:43:57 hyc Exp $ */ /* syncprov.c - syncrepl provider */ /* This work is part of OpenLDAP Software . * @@ -585,11 +585,7 @@ syncprov_findcsn( Operation *op, find_cs char cbuf[LDAP_LUTIL_CSNSTR_BUFSIZE]; struct berval maxcsn; Filter cf; -#ifdef LDAP_COMP_MATCH - AttributeAssertion eq = { NULL, BER_BVNULL, NULL }; -#else - AttributeAssertion eq = { NULL, BER_BVNULL }; -#endif + AttributeAssertion eq = ATTRIBUTEASSERTION_INIT; fpres_cookie pcookie; sync_control *srs = NULL; struct slap_limits_set fc_limits; @@ -659,6 +655,7 @@ again: } else { cf.f_choice = LDAP_FILTER_LE; fop.ors_limit = &fc_limits; + memset( &fc_limits, 0, sizeof( fc_limits )); fc_limits.lms_s_unchecked = 1; fop.ors_filterstr.bv_len = sprintf( buf, "(entryCSN<=%s)", cf.f_av_value.bv_val ); @@ -1482,11 +1479,7 @@ syncprov_playlog( Operation *op, SlapRep SlapReply frs = { REP_RESULT }; int rc; Filter mf, af; -#ifdef LDAP_COMP_MATCH - AttributeAssertion eq = { NULL, BER_BVNULL, NULL }; -#else - AttributeAssertion eq; -#endif + AttributeAssertion eq = ATTRIBUTEASSERTION_INIT; slap_callback cb = {0}; fop = *op; @@ -2307,10 +2300,15 @@ syncprov_operational( a = attr_find( rs->sr_entry->e_attrs, slap_schema.si_ad_contextCSN ); } - free( a->a_vals ); + if ( a->a_nvals != a->a_vals ) { + ber_bvarray_free( a->a_nvals ); + } + a->a_nvals = NULL; + ber_bvarray_free( a->a_vals ); + a->a_vals = NULL; + a->a_numvals = 0; } - ber_bvarray_dup_x( &a->a_vals, si->si_ctxcsn, NULL ); - a->a_nvals = a->a_vals; + attr_valadd( a, si->si_ctxcsn, si->si_ctxcsn, si->si_numcsns ); } ldap_pvt_thread_rdwr_runlock( &si->si_csn_rwlock ); } @@ -2369,9 +2367,9 @@ sp_cf_gen(ConfigArgs *c) case SP_CHKPT: if ( si->si_chkops || si->si_chktime ) { struct berval bv; - bv.bv_len = sprintf( c->msg, "%d %d", + bv.bv_len = sprintf( c->cr_msg, "%d %d", si->si_chkops, si->si_chktime ); - bv.bv_val = c->msg; + bv.bv_val = c->cr_msg; value_add_one( &c->rvalue_vals, &bv ); } else { rc = 1; @@ -2430,31 +2428,31 @@ sp_cf_gen(ConfigArgs *c) switch ( c->type ) { case SP_CHKPT: if ( lutil_atoi( &si->si_chkops, c->argv[1] ) != 0 ) { - snprintf( c->msg, sizeof( c->msg ), "%s unable to parse checkpoint ops # \"%s\"", + snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s unable to parse checkpoint ops # \"%s\"", c->argv[0], c->argv[1] ); Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE, - "%s: %s\n", c->log, c->msg, 0 ); + "%s: %s\n", c->log, c->cr_msg, 0 ); return ARG_BAD_CONF; } if ( si->si_chkops <= 0 ) { - snprintf( c->msg, sizeof( c->msg ), "%s invalid checkpoint ops # \"%d\"", + snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s invalid checkpoint ops # \"%d\"", c->argv[0], si->si_chkops ); Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE, - "%s: %s\n", c->log, c->msg, 0 ); + "%s: %s\n", c->log, c->cr_msg, 0 ); return ARG_BAD_CONF; } if ( lutil_atoi( &si->si_chktime, c->argv[2] ) != 0 ) { - snprintf( c->msg, sizeof( c->msg ), "%s unable to parse checkpoint time \"%s\"", + snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s unable to parse checkpoint time \"%s\"", c->argv[0], c->argv[1] ); Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE, - "%s: %s\n", c->log, c->msg, 0 ); + "%s: %s\n", c->log, c->cr_msg, 0 ); return ARG_BAD_CONF; } if ( si->si_chktime <= 0 ) { - snprintf( c->msg, sizeof( c->msg ), "%s invalid checkpoint time \"%d\"", + snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s invalid checkpoint time \"%d\"", c->argv[0], si->si_chkops ); Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE, - "%s: %s\n", c->log, c->msg, 0 ); + "%s: %s\n", c->log, c->cr_msg, 0 ); return ARG_BAD_CONF; } si->si_chktime *= 60; @@ -2464,10 +2462,10 @@ sp_cf_gen(ConfigArgs *c) int size = c->value_int; if ( size < 0 ) { - snprintf( c->msg, sizeof( c->msg ), "%s size %d is negative", + snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s size %d is negative", c->argv[0], size ); Debug( LDAP_DEBUG_CONFIG|LDAP_DEBUG_NONE, - "%s: %s\n", c->log, c->msg, 0 ); + "%s: %s\n", c->log, c->cr_msg, 0 ); return ARG_BAD_CONF; } sl = si->si_logs; @@ -2511,7 +2509,8 @@ syncprov_db_otask( */ static int syncprov_db_open( - BackendDB *be + BackendDB *be, + ConfigReply *cr ) { slap_overinst *on = (slap_overinst *) be->bd_info; @@ -2555,11 +2554,9 @@ syncprov_db_open( a = attr_find( e->e_attrs, slap_schema.si_ad_contextCSN ); if ( a ) { - int i; ber_bvarray_dup_x( &si->si_ctxcsn, a->a_vals, NULL ); - for ( i = 0; !BER_BVISNULL( &a->a_vals[i] ); i++ ); - si->si_numcsns = i; - si->si_sids = slap_parse_csn_sids( si->si_ctxcsn, i, NULL ); + si->si_numcsns = a->a_numvals; + si->si_sids = slap_parse_csn_sids( si->si_ctxcsn, a->a_numvals, NULL ); } overlay_entry_release_ov( op, e, 0, on ); if ( si->si_ctxcsn ) { @@ -2604,7 +2601,8 @@ out: */ static int syncprov_db_close( - BackendDB *be + BackendDB *be, + ConfigReply *cr ) { slap_overinst *on = (slap_overinst *) be->bd_info; @@ -2614,7 +2612,7 @@ syncprov_db_close( return 0; } if ( si->si_numops ) { - Connection conn; + Connection conn = {0}; OperationBuffer opbuf; Operation *op; SlapReply rs = {REP_RESULT}; @@ -2634,7 +2632,8 @@ syncprov_db_close( static int syncprov_db_init( - BackendDB *be + BackendDB *be, + ConfigReply *cr ) { slap_overinst *on = (slap_overinst *)be->bd_info; @@ -2666,7 +2665,8 @@ syncprov_db_init( static int syncprov_db_destroy( - BackendDB *be + BackendDB *be, + ConfigReply *cr ) { slap_overinst *on = (slap_overinst *)be->bd_info; @@ -2785,8 +2785,8 @@ static int syncprov_parseCtrl ( sr->sr_rhint = rhint; if (!BER_BVISNULL(&cookie)) { ber_dupbv_x( &sr->sr_state.octet_str, &cookie, op->o_tmpmemctx ); - slap_parse_sync_cookie( &sr->sr_state, op->o_tmpmemctx ); - if ( sr->sr_state.rid == -1 ) { + if ( slap_parse_sync_cookie( &sr->sr_state, op->o_tmpmemctx ) || + sr->sr_state.rid == -1 ) { rs->sr_text = "Sync control : cookie parsing error"; return LDAP_PROTOCOL_ERROR; }