X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fsyncrepl.c;h=f0fac417fb7b4c9a8184b9221fac843911ca7da4;hb=62b6b326338d5162b0f570eaeb8a227fbc5a9c62;hp=4d7187ced05eb9c523332baeb8f8936deaf89735;hpb=5c0581b1840103de15ac2a30c7b5cb9f4322e2cd;p=openldap diff --git a/servers/slapd/syncrepl.c b/servers/slapd/syncrepl.c index 4d7187ced0..f0fac417fb 100644 --- a/servers/slapd/syncrepl.c +++ b/servers/slapd/syncrepl.c @@ -23,7 +23,6 @@ #include #include -#include "ldap_pvt.h" #include "lutil.h" #include "slap.h" #include "lutil_ldap.h" @@ -69,7 +68,6 @@ init_syncrepl(syncinfo_t *si) attrs = anlist2attrs( si->si_anlist ); if ( attrs ) { - if ( si->si_allattrs ) { i = 0; while ( attrs[i] ) { @@ -83,7 +81,10 @@ init_syncrepl(syncinfo_t *si) i++; } } - attrs = ( char ** ) ch_realloc( attrs, (i + 1)*sizeof( char * )); + attrs = ( char ** ) ch_realloc( attrs, (i + 2)*sizeof( char * ) ); + attrs[i] = ch_strdup("*"); + attrs[i + 1] = NULL; + } else if ( si->si_allopattrs ) { i = 0; while ( attrs[i] ) { @@ -97,7 +98,9 @@ init_syncrepl(syncinfo_t *si) i++; } } - attrs = ( char ** ) ch_realloc( attrs, (i + 1)*sizeof( char * )); + attrs = ( char ** ) ch_realloc( attrs, (i + 2)*sizeof( char * ) ); + attrs[i] = ch_strdup("+"); + attrs[i + 1] = NULL; } if ( !si->si_allopattrs ) { @@ -125,18 +128,40 @@ init_syncrepl(syncinfo_t *si) /* Add Attributes */ for ( i = 0; sync_descs[ i ] != NULL; i++ ) { attrs[ n++ ] = ch_strdup ( sync_descs[i]->ad_cname.bv_val ); - attrs[ n ] = NULL; } + attrs[ n ] = NULL; } } else { - attrs = ( char ** ) ch_realloc( attrs, 3 * sizeof( char * )); + for ( n = 0; sync_descs[ n ] != NULL; n++ ) ; + + attrs = ( char ** ) ch_malloc(( + (si->si_allattrs ? 1 : ( si->si_allopattrs ? 0 : 1)) + + (si->si_allopattrs ? 1 : ( si->si_allattrs ? n : 1)) + + 1 ) * sizeof( char * ) ); if ( attrs == NULL ) { - Debug( LDAP_DEBUG_ANY, "out of memory\n", 0,0,0 ); + Debug( LDAP_DEBUG_ANY, "out of memory\n", 0, 0, 0 ); + } + + i = 0; + if ( si->si_allattrs ) { + attrs[i++] = ch_strdup( "*" ); + } + + if ( si->si_allopattrs ) { + attrs[i++] = ch_strdup( "+" ); + } else { + for ( j = 0; sync_descs[ j ] != NULL; j++ ) { + attrs[ i++ ] = ch_strdup ( sync_descs[j]->ad_cname.bv_val ); + } + } + attrs[i] = NULL; + + if ( !si->si_allattrs && !si->si_allopattrs ) { + attrs[0] = ch_strdup( "*" ); + attrs[1] = ch_strdup( "+" ); + attrs[2] = NULL; } - attrs[0] = ch_strdup( "*" ); - attrs[1] = ch_strdup( "+" ); - attrs[2] = NULL; } si->si_attrs = attrs; @@ -144,6 +169,7 @@ init_syncrepl(syncinfo_t *si) exattrs = anlist2attrs( si->si_exanlist ); if ( exattrs ) { + for ( n = 0; exattrs[n] != NULL; n++ ) ; for ( i = 0; sync_descs[i] != NULL; i++ ) { j = 0; @@ -181,7 +207,9 @@ init_syncrepl(syncinfo_t *si) } for ( i = 0; exattrs[i] != NULL; i++ ) ; - exattrs = (char **) ch_realloc( exattrs, (i + 1)*sizeof(char *)); + + if ( i != n ) + exattrs = (char **) ch_realloc( exattrs, (i + 1)*sizeof(char *)); } si->si_exattrs = exattrs; @@ -204,7 +232,7 @@ ldap_sync_search( ber_set_option( ber, LBER_OPT_BER_MEMCTX, &ctx ); if ( si->si_syncCookie.octet_str && - si->si_syncCookie.octet_str[0].bv_val ) + !BER_BVISNULL( &si->si_syncCookie.octet_str[0] ) ) { ber_printf( ber, "{eO}", abs(si->si_type), @@ -372,7 +400,7 @@ do_syncrep1( /* get syncrepl cookie of shadow replica from subentry */ assert( si->si_rid < 1000 ); syncrepl_cn_bv.bv_val = syncrepl_cbuf; - syncrepl_cn_bv.bv_len = snprintf(syncrepl_cbuf, sizeof(syncrepl_cbuf), + syncrepl_cn_bv.bv_len = snprintf( syncrepl_cbuf, sizeof(syncrepl_cbuf), CN_STR "syncrepl%ld", si->si_rid ); build_new_dn( &op->o_req_ndn, psub, &syncrepl_cn_bv, op->o_tmpmemctx ); op->o_req_dn = op->o_req_ndn; @@ -399,7 +427,7 @@ do_syncrep1( if ( !cookie ) { /* no stored cookie */ if ( sc->ctxcsn == NULL || - sc->ctxcsn->bv_val == NULL ) { + BER_BVISNULL( sc->ctxcsn ) ) { /* if cmdline cookie does not have ctxcsn */ /* component, set it to an initial value */ slap_init_sync_cookie_ctxcsn( sc ); @@ -559,6 +587,9 @@ do_syncrep2( ldap_get_entry_controls( si->si_ld, msg, &rctrls ); /* we can't work without the control */ if ( !rctrls ) { + Debug( LDAP_DEBUG_ANY, "do_syncrep2 : " + "got search entry without " + "control\n", 0, 0, 0 ); rc = -1; goto done; } @@ -567,21 +598,23 @@ do_syncrep2( ber_scanf( ber, "{em" /*"}"*/, &syncstate, &syncUUID ); if ( ber_peek_tag( ber, &len ) == LDAP_TAG_SYNC_COOKIE ) { ber_scanf( ber, /*"{"*/ "m}", &cookie ); - if ( cookie.bv_val ) { + if ( !BER_BVISNULL( &cookie ) ) { struct berval tmp_bv; ber_dupbv( &tmp_bv, &cookie ); ber_bvarray_add( &syncCookie.octet_str, &tmp_bv ); } if ( syncCookie.octet_str && - syncCookie.octet_str[0].bv_val ) + !BER_BVISNULL( &syncCookie.octet_str[0] ) ) + { slap_parse_sync_cookie( &syncCookie ); + } } if ( syncrepl_message_to_entry( si, op, msg, &modlist, &entry, syncstate ) == LDAP_SUCCESS ) { rc_efree = syncrepl_entry( si, op, entry, modlist, syncstate, &syncUUID, &syncCookie_req ); if ( syncCookie.octet_str && - syncCookie.octet_str[0].bv_val ) + !BER_BVISNULL( &syncCookie.octet_str[0] ) ) { syncrepl_updateCookie( si, op, psub, &syncCookie ); } @@ -611,13 +644,13 @@ do_syncrep2( ber_scanf( ber, "{" /*"}"*/); if ( ber_peek_tag( ber, &len ) == LDAP_TAG_SYNC_COOKIE ) { ber_scanf( ber, "m", &cookie ); - if ( cookie.bv_val ) { + if ( !BER_BVISNULL( &cookie ) ) { struct berval tmp_bv; ber_dupbv( &tmp_bv, &cookie ); ber_bvarray_add( &syncCookie.octet_str, &tmp_bv); } if ( syncCookie.octet_str && - syncCookie.octet_str[0].bv_val ) + !BER_BVISNULL( &syncCookie.octet_str[0] ) ) { slap_parse_sync_cookie( &syncCookie ); } @@ -639,7 +672,7 @@ do_syncrep2( &syncCookie_req.ctxcsn[0], &syncCookie.ctxcsn[0], &text ); } - if ( syncCookie.octet_str && syncCookie.octet_str->bv_val && + if ( syncCookie.octet_str && !BER_BVISNULL( syncCookie.octet_str ) && match < 0 && err == LDAP_SUCCESS ) { syncrepl_updateCookie( si, op, psub, &syncCookie ); @@ -686,14 +719,14 @@ do_syncrep2( if ( ber_peek_tag( ber, &len ) == LDAP_TAG_SYNC_COOKIE ) { ber_scanf( ber, "m", &cookie ); - if ( cookie.bv_val ) { + if ( !BER_BVISNULL( &cookie ) ) { struct berval tmp_bv; ber_dupbv( &tmp_bv, &cookie ); ber_bvarray_add( &syncCookie.octet_str, &tmp_bv); } if ( syncCookie.octet_str && - syncCookie.octet_str[0].bv_val ) + !BER_BVISNULL( &syncCookie.octet_str[0] ) ) { slap_parse_sync_cookie( &syncCookie ); } @@ -711,14 +744,14 @@ do_syncrep2( LDAP_TAG_SYNC_COOKIE ) { ber_scanf( ber, "m", &cookie ); - if ( cookie.bv_val ) { + if ( !BER_BVISNULL( &cookie ) ) { struct berval tmp_bv; ber_dupbv( &tmp_bv, &cookie ); ber_bvarray_add( &syncCookie.octet_str, &tmp_bv ); } if ( syncCookie.octet_str && - syncCookie.octet_str[0].bv_val ) + !BER_BVISNULL( &syncCookie.octet_str[0] ) ) { slap_parse_sync_cookie( &syncCookie ); } @@ -730,7 +763,7 @@ do_syncrep2( } ber_scanf( ber, "[W]", &syncUUIDs ); ber_scanf( ber, /*"{"*/ "}" ); - for ( i = 0; syncUUIDs[i].bv_val; i++ ) { + for ( i = 0; !BER_BVISNULL( &syncUUIDs[i] ); i++ ) { struct berval *syncuuid_bv; syncuuid_bv = ber_dupbv( NULL, &syncUUIDs[i] ); slap_sl_free( syncUUIDs[i].bv_val,op->o_tmpmemctx ); @@ -761,7 +794,7 @@ do_syncrep2( &syncCookie.ctxcsn[0], &text ); } - if ( syncCookie.ctxcsn && syncCookie.ctxcsn[0].bv_val && + if ( syncCookie.ctxcsn && !BER_BVISNULL( &syncCookie.ctxcsn[0] ) && match < 0 ) { syncrepl_updateCookie( si, op, psub, &syncCookie); @@ -1028,7 +1061,7 @@ syncrepl_message_to_entry( while ( ber_remaining( ber ) ) { if ( (ber_scanf( ber, "{mW}", &tmp.sml_type, &tmp.sml_values ) == - LBER_ERROR ) || ( tmp.sml_type.bv_val == NULL )) + LBER_ERROR ) || BER_BVISNULL( &tmp.sml_type ) ) { break; } @@ -1154,15 +1187,15 @@ syncrepl_entry( f.f_choice = LDAP_FILTER_EQUALITY; f.f_ava = &ava; ava.aa_desc = slap_schema.si_ad_entryUUID; - slap_uuidstr_from_normalized( &syncUUID_strrep, syncUUID, op->o_tmpmemctx ); + (void)slap_uuidstr_from_normalized( &syncUUID_strrep, syncUUID, op->o_tmpmemctx ); ava.aa_value = *syncUUID; op->ors_filter = &f; - op->ors_filterstr.bv_len = (sizeof("entryUUID=")-1) + syncUUID->bv_len; + op->ors_filterstr.bv_len = STRLENOF( "entryUUID=" ) + syncUUID->bv_len; op->ors_filterstr.bv_val = (char *) slap_sl_malloc( op->ors_filterstr.bv_len + 1, op->o_tmpmemctx ); - AC_MEMCPY( op->ors_filterstr.bv_val, "entryUUID=", sizeof("entryUUID=")-1 ); - AC_MEMCPY( &op->ors_filterstr.bv_val[sizeof("entryUUID=")-1], + AC_MEMCPY( op->ors_filterstr.bv_val, "entryUUID=", STRLENOF( "entryUUID=" ) ); + AC_MEMCPY( &op->ors_filterstr.bv_val[STRLENOF( "entryUUID=" )], syncUUID->bv_val, syncUUID->bv_len ); op->ors_filterstr.bv_val[op->ors_filterstr.bv_len] = '\0'; @@ -1185,20 +1218,21 @@ syncrepl_entry( cb.sc_response = dn_callback; cb.sc_private = si; - si->si_syncUUID_ndn.bv_val = NULL; + BER_BVZERO( &si->si_syncUUID_ndn ); if ( limits_check( op, &rs_search ) == 0 ) { rc = be->be_search( op, &rs_search ); } - if ( op->ors_filterstr.bv_val ) { + if ( !BER_BVISNULL( &op->ors_filterstr ) ) { slap_sl_free( op->ors_filterstr.bv_val, op->o_tmpmemctx ); } cb.sc_response = null_callback; cb.sc_private = si; - if ( rs_search.sr_err == LDAP_SUCCESS && si->si_syncUUID_ndn.bv_val ) { + if ( rs_search.sr_err == LDAP_SUCCESS && !BER_BVISNULL( &si->si_syncUUID_ndn ) ) + { char *subseq_ptr; if ( syncstate != LDAP_SYNC_DELETE ) { @@ -1206,7 +1240,7 @@ syncrepl_entry( } ber_dupbv( &op->o_sync_csn, syncCookie_req->ctxcsn ); - if ( op->o_sync_csn.bv_val ) { + if ( !BER_BVISNULL( &op->o_sync_csn ) ) { subseq_ptr = strstr( op->o_sync_csn.bv_val, "#0000" ); subseq_ptr += 4; *subseq_ptr = '1'; @@ -1342,12 +1376,13 @@ syncrepl_entry( done : - if ( syncUUID_strrep.bv_val ) { + if ( !BER_BVISNULL( &syncUUID_strrep ) ) { slap_sl_free( syncUUID_strrep.bv_val, op->o_tmpmemctx ); + BER_BVZERO( &syncUUID_strrep ); } - if ( si->si_syncUUID_ndn.bv_val ) { + if ( !BER_BVISNULL( &si->si_syncUUID_ndn ) ) { ch_free( si->si_syncUUID_ndn.bv_val ); - si->si_syncUUID_ndn.bv_val = NULL; + BER_BVZERO( &si->si_syncUUID_ndn ); } return ret; } @@ -1497,8 +1532,8 @@ syncrepl_del_nonpresent( ber_bvfree( np_prev->npe_name ); ber_bvfree( np_prev->npe_nname ); - op->o_req_dn.bv_val = NULL; - op->o_req_ndn.bv_val = NULL; + BER_BVZERO( &op->o_req_dn ); + BER_BVZERO( &op->o_req_ndn ); ch_free( np_prev ); } } @@ -1532,8 +1567,8 @@ syncrepl_add_glue( ndn = e->e_nname; /* count RDNs in suffix */ - if ( be->be_nsuffix[0].bv_len ) { - for (i=0, ptr=be->be_nsuffix[0].bv_val; ptr; ptr=strchr( ptr, ',' )) { + if ( !BER_BVISEMPTY( &be->be_nsuffix[0] ) ) { + for ( i = 0, ptr = be->be_nsuffix[0].bv_val; ptr; ptr = strchr( ptr, ',' ) ) { ptr++; i++; } @@ -1545,7 +1580,7 @@ syncrepl_add_glue( /* Start with BE suffix */ for ( i = 0, ptr = NULL; i < suffrdns; i++ ) { - comma = strrchr(dn.bv_val, ','); + comma = strrchr( dn.bv_val, ',' ); if ( ptr ) *ptr = ','; if ( comma ) *comma = '\0'; ptr = comma; @@ -1758,7 +1793,7 @@ syncrepl_updateCookie( ber_dupbv( &e->e_name, &slap_syncrepl_dn_bv ); ber_dupbv( &e->e_nname, &slap_syncrepl_dn_bv ); - if ( slap_syncrepl_dn_bv.bv_val ) { + if ( !BER_BVISNULL( &slap_syncrepl_dn_bv ) ) { slap_sl_free( slap_syncrepl_dn_bv.bv_val, op->o_tmpmemctx ); } @@ -1819,13 +1854,13 @@ update_cookie_retry: done : - if ( cnbva[0].bv_val ) { + if ( !BER_BVISNULL( &cnbva[0] ) ) { ch_free( cnbva[0].bv_val ); - cnbva[0].bv_val = NULL; + BER_BVZERO( &cnbva[0] ); } - if ( scbva[0].bv_val ) { + if ( !BER_BVISNULL( &scbva[0] ) ) { ch_free( scbva[0].bv_val ); - scbva[0].bv_val = NULL; + BER_BVZERO( &scbva[0] ); } if ( mlnext->sml_next ) { @@ -1873,16 +1908,18 @@ dn_callback( syncinfo_t *si = op->o_callback->sc_private; if ( rs->sr_type == REP_SEARCH ) { - if ( si->si_syncUUID_ndn.bv_val != NULL ) { + if ( !BER_BVISNULL( &si->si_syncUUID_ndn ) ) { Debug( LDAP_DEBUG_ANY, - "dn_callback : consistency error - entryUUID is not unique\n", 0, 0, 0 ); + "dn_callback : consistency error - " + "entryUUID is not unique\n", 0, 0, 0 ); } else { ber_dupbv_x( &si->si_syncUUID_ndn, &rs->sr_entry->e_nname, NULL ); } } else if ( rs->sr_type == REP_RESULT ) { if ( rs->sr_err == LDAP_SIZELIMIT_EXCEEDED ) { Debug( LDAP_DEBUG_ANY, - "dn_callback : consistency error - entryUUID is not unique\n", 0, 0, 0 ); + "dn_callback : consistency error - " + "entryUUID is not unique\n", 0, 0, 0 ); } } @@ -1972,8 +2009,7 @@ slap_create_syncrepl_entry( context_csn, NULL ); } - bv.bv_val = "{}"; - bv.bv_len = sizeof("{}")-1; + BER_BVSTR( &bv, "{}" ); attr_merge_one( e, slap_schema.si_ad_subtreeSpecification, &bv, NULL ); build_new_dn( &e->e_name, &be->be_nsuffix[0], rdn, NULL ); @@ -1999,12 +2035,17 @@ slap_uuidstr_from_normalized( new = uuidstr; } else { new = (struct berval *)slap_sl_malloc( sizeof(struct berval), ctx ); + if ( new == NULL ) { + return NULL; + } } new->bv_len = 36; - if (( new->bv_val = slap_sl_malloc( new->bv_len + 1, ctx )) == NULL) { - if ( !uuidstr ) slap_sl_free( new, ctx ); + if ( ( new->bv_val = slap_sl_malloc( new->bv_len + 1, ctx ) ) == NULL ) { + if ( new != uuidstr ) { + slap_sl_free( new, ctx ); + } return NULL; } @@ -2044,11 +2085,13 @@ syncuuid_cmp( const void* v_uuid1, const void* v_uuid2 ) } static void -avl_ber_bvfree( void *bv ) +avl_ber_bvfree( void *v_bv ) { - if( bv == NULL ) return; - if ( ((struct berval *)bv)->bv_val != NULL ) { - ch_free( ((struct berval *)bv)->bv_val ); + struct berval *bv = (struct berval *)v_bv; + + if( v_bv == NULL ) return; + if ( !BER_BVISNULL( bv ) ) { + ch_free( bv->bv_val ); } ch_free( (char *) bv ); }