X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fsyncrepl.c;h=25a09460621b939b6e7909a3a123a3dae2866610;hb=c2b339d45688060a187bf8a34c1b1c1c4699de16;hp=b92f3d2f9848e97a9d91c37684005e2f301fcdf5;hpb=a6c08d747fa1f191c50c33378b8d19d390e26e65;p=openldap diff --git a/servers/slapd/syncrepl.c b/servers/slapd/syncrepl.c index b92f3d2f98..25a0946062 100644 --- a/servers/slapd/syncrepl.c +++ b/servers/slapd/syncrepl.c @@ -23,13 +23,16 @@ #include #include -#include "ldap_pvt.h" #include "lutil.h" #include "slap.h" #include "lutil_ldap.h" #include "ldap_rq.h" +/* FIXME: for ldap_ld_free() */ +#undef ldap_debug +#include "../../libraries/libldap/ldap-int.h" + #define SYNCREPL_STR "syncreplxxx" #define CN_STR "cn=" @@ -52,8 +55,8 @@ struct runqueue_s syncrepl_rq; void init_syncrepl(syncinfo_t *si) { - int i, j, k, n; - char **tmp; + int i, j, k, l, n; + char **attrs, **exattrs; if ( !sync_descs[0] ) { sync_descs[0] = slap_schema.si_ad_objectClass; @@ -62,54 +65,156 @@ init_syncrepl(syncinfo_t *si) sync_descs[3] = NULL; } - for ( n = 0; si->si_attrs[ n ] != NULL; n++ ) /* empty */; + if ( si->si_allattrs && si->si_allopattrs ) + attrs = NULL; + else + attrs = anlist2attrs( si->si_anlist ); + + if ( attrs ) { + if ( si->si_allattrs ) { + i = 0; + while ( attrs[i] ) { + if ( !is_at_operational( at_find( attrs[i] ))) { + for ( j = i; attrs[j] != NULL; j++ ) { + if ( j == i ) + ch_free( attrs[i] ); + attrs[j] = attrs[j+1]; + } + } else { + i++; + } + } + 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] ) { + if ( is_at_operational( at_find( attrs[i] ))) { + for ( j = i; attrs[j] != NULL; j++ ) { + if ( j == i ) + ch_free( attrs[i] ); + attrs[j] = attrs[j+1]; + } + } else { + i++; + } + } + attrs = ( char ** ) ch_realloc( attrs, (i + 2)*sizeof( char * ) ); + attrs[i] = ch_strdup("+"); + attrs[i + 1] = NULL; + } - if ( n ) { - /* Delete Attributes */ for ( i = 0; sync_descs[i] != NULL; i++ ) { - for ( j = 0; si->si_attrs[j] != NULL; j++ ) { - if ( strcmp( si->si_attrs[j], sync_descs[i]->ad_cname.bv_val ) - == 0 ) - { - ch_free( si->si_attrs[j] ); - for ( k = j; si->si_attrs[k] != NULL; k++ ) { - si->si_attrs[k] = si->si_attrs[k+1]; + j = 0; + while ( attrs[j] ) { + if ( !strcmp( attrs[j], sync_descs[i]->ad_cname.bv_val )) { + for ( k = j; attrs[k] != NULL; k++ ) { + if ( k == j ) + ch_free( attrs[k] ); + attrs[k] = attrs[k+1]; } + } else { + j++; } } } - for ( n = 0; si->si_attrs[ n ] != NULL; n++ ) /* empty */; - tmp = ( char ** ) ch_realloc( si->si_attrs, (n + 4)*sizeof( char * )); - if ( tmp == NULL ) { -#ifdef NEW_LOGGING - LDAP_LOG( OPERATION, ERR, "out of memory\n", 0,0,0 ); -#else + + for ( n = 0; attrs[ n ] != NULL; n++ ) /* empty */; + + if ( si->si_allopattrs ) { + attrs = ( char ** ) ch_realloc( attrs, (n + 2)*sizeof( char * )); + } else { + attrs = ( char ** ) ch_realloc( attrs, (n + 4)*sizeof( char * )); + } + + if ( attrs == NULL ) { Debug( LDAP_DEBUG_ANY, "out of memory\n", 0,0,0 ); -#endif } /* Add Attributes */ - for ( i = 0; sync_descs[ i ] != NULL; i++ ) { - tmp[ n++ ] = ch_strdup ( sync_descs[i]->ad_cname.bv_val ); - tmp[ n ] = NULL; + if ( si->si_allopattrs ) { + attrs[n++] = ch_strdup( sync_descs[0]->ad_cname.bv_val ); + } else { + for ( i = 0; sync_descs[ i ] != NULL; i++ ) { + attrs[ n++ ] = ch_strdup ( sync_descs[i]->ad_cname.bv_val ); + } } + attrs[ n ] = NULL; } else { - tmp = ( char ** ) ch_realloc( si->si_attrs, 3 * sizeof( char * )); - if ( tmp == NULL ) { -#ifdef NEW_LOGGING - LDAP_LOG( OPERATION, ERR, "out of memory\n", 0,0,0 ); -#else - Debug( LDAP_DEBUG_ANY, "out of memory\n", 0,0,0 ); -#endif + + i = 0; + if ( si->si_allattrs == si->si_allopattrs ) { + attrs = (char**) ch_malloc( 3 * sizeof(char*) ); + attrs[i++] = ch_strdup( "*" ); + attrs[i++] = ch_strdup( "+" ); + } else if ( si->si_allattrs && !si->si_allopattrs ) { + for ( n = 0; sync_descs[ n ] != NULL; n++ ) ; + attrs = (char**) ch_malloc( (n+1)* sizeof(char*) ); + attrs[i++] = ch_strdup( "*" ); + for ( j = 1; sync_descs[ j ] != NULL; j++ ) { + attrs[i++] = ch_strdup ( sync_descs[j]->ad_cname.bv_val ); + } + } else if ( !si->si_allattrs && si->si_allopattrs ) { + attrs = (char**) ch_malloc( 3 * sizeof(char*) ); + attrs[i++] = ch_strdup( "+" ); + attrs[i++] = ch_strdup( sync_descs[0]->ad_cname.bv_val ); } - tmp[ n++ ] = ch_strdup( "*" ); - tmp[ n++ ] = ch_strdup( "+" ); - tmp[ n ] = NULL; + attrs[i] = NULL; } - si->si_attrs = tmp; + si->si_attrs = attrs; + exattrs = anlist2attrs( si->si_exanlist ); + + if ( exattrs ) { + for ( n = 0; exattrs[n] != NULL; n++ ) ; + + for ( i = 0; sync_descs[i] != NULL; i++ ) { + j = 0; + while ( exattrs[j] != NULL ) { + if ( !strcmp( exattrs[j], sync_descs[i]->ad_cname.bv_val )) { + for ( k = j; exattrs[k] != NULL; k++ ) { + if ( k == j ) + ch_free( exattrs[k] ); + exattrs[k] = exattrs[k+1]; + } + } else { + j++; + } + } + } + + for ( i = 0; exattrs[i] != NULL; i++ ) { + for ( j = 0; si->si_anlist[j].an_name.bv_val; j++ ) { + ObjectClass *oc; + if ( ( oc = si->si_anlist[j].an_oc ) ) { + k = 0; + while ( oc->soc_required[k] ) { + if ( !strcmp( exattrs[i], + oc->soc_required[k]->sat_cname.bv_val )) { + for ( l = i; exattrs[l]; l++ ) { + if ( l == i ) + ch_free( exattrs[i] ); + exattrs[l] = exattrs[l+1]; + } + } else { + k++; + } + } + } + } + } + + for ( i = 0; exattrs[i] != NULL; i++ ) ; + + if ( i != n ) + exattrs = (char **) ch_realloc( exattrs, (i + 1)*sizeof(char *)); + } + + si->si_exattrs = exattrs; } static int @@ -129,7 +234,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), @@ -180,7 +285,6 @@ do_syncrep1( char syncrepl_cbuf[sizeof(CN_STR SYNCREPL_STR)]; struct berval syncrepl_cn_bv; struct sync_cookie *sc = NULL; - struct sync_cookie syncCookie = { NULL, -1, NULL }; struct berval *psub; #ifdef HAVE_TLS void *ssl; @@ -191,15 +295,9 @@ do_syncrep1( /* Init connection to master */ rc = ldap_initialize( &si->si_ld, si->si_provideruri ); if ( rc != LDAP_SUCCESS ) { -#ifdef NEW_LOGGING - LDAP_LOG( OPERATION, ERR, - "do_syncrep1: ldap_initialize failed (%s)\n", - si->si_provideruri, 0, 0 ); -#else Debug( LDAP_DEBUG_ANY, "do_syncrep1: ldap_initialize failed (%s)\n", si->si_provideruri, 0, 0 ); -#endif return rc; } @@ -211,17 +309,10 @@ do_syncrep1( if ( si->si_tls ) { rc = ldap_start_tls_s( si->si_ld, NULL, NULL ); if( rc != LDAP_SUCCESS ) { -#ifdef NEW_LOGGING - LDAP_LOG ( OPERATION, ERR, "do_syncrep1: " - "%s: ldap_start_tls failed (%d)\n", - si->si_tls == SYNCINFO_TLS_CRITICAL ? "Error" : "Warning", - rc, 0 ); -#else Debug( LDAP_DEBUG_ANY, "%s: ldap_start_tls failed (%d)\n", si->si_tls == SYNCINFO_TLS_CRITICAL ? "Error" : "Warning", rc, 0 ); -#endif if( si->si_tls == SYNCINFO_TLS_CRITICAL ) goto done; } } @@ -235,15 +326,9 @@ do_syncrep1( LDAP_OPT_X_SASL_SECPROPS, si->si_secprops); if( rc != LDAP_OPT_SUCCESS ) { -#ifdef NEW_LOGGING - LDAP_LOG ( OPERATION, ERR, "do_bind: Error: " - "ldap_set_option(%s,SECPROPS,\"%s\") failed!\n", - si->si_provideruri, si->si_secprops, 0 ); -#else Debug( LDAP_DEBUG_ANY, "Error: ldap_set_option " "(%s,SECPROPS,\"%s\") failed!\n", si->si_provideruri, si->si_secprops, 0 ); -#endif goto done; } } @@ -266,15 +351,9 @@ do_syncrep1( * 2) on err policy : exit, retry, backoff ... */ if ( rc != LDAP_SUCCESS ) { -#ifdef NEW_LOGGING - LDAP_LOG ( OPERATION, ERR, "do_syncrep1: " - "ldap_sasl_interactive_bind_s failed (%d)\n", - rc, 0, 0 ); -#else Debug( LDAP_DEBUG_ANY, "do_syncrep1: " "ldap_sasl_interactive_bind_s failed (%d)\n", rc, 0, 0 ); -#endif /* FIXME (see above comment) */ /* if Kerberos credentials cache is not active, retry */ @@ -298,13 +377,8 @@ do_syncrep1( rc = ldap_bind_s( si->si_ld, si->si_binddn, si->si_passwd, si->si_bindmethod ); if ( rc != LDAP_SUCCESS ) { -#ifdef NEW_LOGGING - LDAP_LOG ( OPERATION, ERR, "do_syncrep1: " - "ldap_bind_s failed (%d)\n", rc, 0, 0 ); -#else Debug( LDAP_DEBUG_ANY, "do_syncrep1: " "ldap_bind_s failed (%d)\n", rc, 0, 0 ); -#endif goto done; } } @@ -327,7 +401,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; @@ -354,7 +428,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 ); @@ -417,13 +491,8 @@ do_syncrep1( rc = ldap_sync_search( si, op->o_tmpmemctx ); if( rc != LDAP_SUCCESS ) { -#ifdef NEW_LOGGING - LDAP_LOG ( OPERATION, ERR, "do_syncrep1: " - "ldap_search_ext: %s (%d)\n", ldap_err2string( rc ), rc, 0 ); -#else Debug( LDAP_DEBUG_ANY, "do_syncrep1: " "ldap_search_ext: %s (%d)\n", ldap_err2string( rc ), rc, 0 ); -#endif } done: @@ -434,6 +503,8 @@ done: } } + slap_sl_free( op->o_req_ndn.bv_val, op->o_tmpmemctx ); + return rc; } @@ -489,11 +560,7 @@ do_syncrep2( ber_init2( ber, NULL, LBER_USE_DER ); ber_set_option( ber, LBER_OPT_BER_MEMCTX, &op->o_tmpmemctx ); -#ifdef NEW_LOGGING - LDAP_LOG ( OPERATION, DETAIL1, "do_syncrep2\n", 0, 0, 0 ); -#else Debug( LDAP_DEBUG_TRACE, "=>do_syncrep2\n", 0, 0, 0 ); -#endif psub = &si->si_be->be_nsuffix[0]; @@ -521,6 +588,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; } @@ -529,21 +599,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 ); + syncstate, &syncUUID, &syncCookie_req, syncCookie.ctxcsn ); if ( syncCookie.octet_str && - syncCookie.octet_str[0].bv_val ) + !BER_BVISNULL( &syncCookie.octet_str[0] ) ) { syncrepl_updateCookie( si, op, psub, &syncCookie ); } @@ -559,16 +631,13 @@ do_syncrep2( break; case LDAP_RES_SEARCH_REFERENCE: -#ifdef NEW_LOGGING - LDAP_LOG( OPERATION, ERR, - "do_syncrep2 : reference received\n", 0, 0, 0 ); -#else Debug( LDAP_DEBUG_ANY, - "do_syncrep2 : reference received\n", 0, 0, 0 ); -#endif + "do_syncrep2: reference received error\n", 0, 0, 0 ); break; case LDAP_RES_SEARCH_RESULT: + Debug( LDAP_DEBUG_SYNC, + "do_syncrep2: LDAP_RES_SEARCH_RESULT\n", 0, 0, 0 ); ldap_parse_result( si->si_ld, msg, &err, NULL, NULL, NULL, &rctrls, 0 ); if ( rctrls ) { @@ -578,13 +647,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 ); } @@ -606,7 +675,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 ); @@ -636,31 +705,44 @@ do_syncrep2( rc = ldap_parse_intermediate( si->si_ld, msg, &retoid, &retdata, NULL, 0 ); if ( !rc && !strcmp( retoid, LDAP_SYNC_INFO ) ) { - int si_refreshDelete = 0; - int si_refreshPresent = 0; ber_init2( ber, retdata, LBER_USE_DER ); switch ( si_tag = ber_peek_tag( ber, &len )) { ber_tag_t tag; case LDAP_TAG_SYNC_NEW_COOKIE: + Debug( LDAP_DEBUG_SYNC, + "do_syncrep2: %s - %s%s\n", + "LDAP_RES_INTERMEDIATE", + "NEW_COOKIE", "\n" ); ber_scanf( ber, "tm", &tag, &cookie ); break; case LDAP_TAG_SYNC_REFRESH_DELETE: - si_refreshDelete = 1; + Debug( LDAP_DEBUG_SYNC, + "do_syncrep2: %s - %s%s\n", + "LDAP_RES_INTERMEDIATE", + "REFRESH_DELETE\n", "\n" ); + si->si_refreshDelete = 1; case LDAP_TAG_SYNC_REFRESH_PRESENT: - si_refreshPresent = 1; + Debug( LDAP_DEBUG_SYNC, + "do_syncrep2: %s - %s%s\n", + "LDAP_RES_INTERMEDIATE", + si_tag == LDAP_TAG_SYNC_REFRESH_PRESENT ? + "REFRESH_PRESENT" : "REFRESH_DELETE", + "\n" ); + si->si_refreshDelete = 1; + si->si_refreshPresent = 1; ber_scanf( ber, "t{" /*"}"*/, &tag ); 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 ); } @@ -673,19 +755,24 @@ do_syncrep2( ber_scanf( ber, /*"{"*/ "}" ); break; case LDAP_TAG_SYNC_ID_SET: + Debug( LDAP_DEBUG_SYNC, + "do_syncrep2: %s - %s%s\n", + "LDAP_RES_INTERMEDIATE", + "SYNC_ID_SET", + "\n" ); ber_scanf( ber, "t{" /*"}"*/, &tag ); 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 ); } @@ -697,25 +784,20 @@ 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 ); avl_insert( &si->si_presentlist, (caddr_t) syncuuid_bv, syncuuid_cmp, avl_dup_error ); } - ber_memfree_x( syncUUIDs, op->o_tmpmemctx ); + slap_sl_free( syncUUIDs, op->o_tmpmemctx ); break; default: -#ifdef NEW_LOGGING - LDAP_LOG( OPERATION, ERR, - "do_syncrep2 : unknown syncinfo tag (%ld)\n", - (long) si_tag, 0, 0 ); -#else - Debug( LDAP_DEBUG_ANY, - "do_syncrep2 : unknown syncinfo tag (%ld)\n", + Debug( LDAP_DEBUG_ANY, + "do_syncrep2 : unknown syncinfo tag (%ld)\n", (long) si_tag, 0, 0 ); -#endif ldap_memfree( retoid ); ber_bvfree( retdata ); continue; @@ -733,13 +815,13 @@ 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); } - if ( si_refreshPresent == 1 ) { + if ( si->si_refreshPresent == 1 ) { if ( match < 0 ) { syncrepl_del_nonpresent( op, si ); } @@ -750,15 +832,9 @@ do_syncrep2( break; } else { -#ifdef NEW_LOGGING - LDAP_LOG( OPERATION, ERR, "do_syncrep2 :" - " unknown intermediate " - "response\n", 0, 0, 0 ); -#else Debug( LDAP_DEBUG_ANY, "do_syncrep2 : " "unknown intermediate response (%d)\n", rc, 0, 0 ); -#endif ldap_memfree( retoid ); ber_bvfree( retdata ); break; @@ -766,13 +842,8 @@ do_syncrep2( break; default: -#ifdef NEW_LOGGING - LDAP_LOG( OPERATION, ERR, "do_syncrep2 : " - "unknown message\n", 0, 0, 0 ); -#else Debug( LDAP_DEBUG_ANY, "do_syncrep2 : " "unknown message\n", 0, 0, 0 ); -#endif break; } @@ -792,13 +863,8 @@ do_syncrep2( ldap_get_option( si->si_ld, LDAP_OPT_ERROR_NUMBER, &rc ); errstr = ldap_err2string( rc ); -#ifdef NEW_LOGGING - LDAP_LOG( OPERATION, ERR, - "do_syncrep2 : %s\n", errstr, 0, 0 ); -#else Debug( LDAP_DEBUG_ANY, "do_syncrep2 : %s\n", errstr, 0, 0 ); -#endif } done: @@ -824,17 +890,15 @@ do_syncrepl( syncinfo_t *si = ( syncinfo_t * ) rtask->arg; Connection conn = {0}; Operation op = {0}; + Opheader ohdr = {0}; int rc = LDAP_SUCCESS; int first = 0; int dostop = 0; ber_socket_t s; int i, defer = 1; + Backend *be; -#ifdef NEW_LOGGING - LDAP_LOG ( OPERATION, DETAIL1, "do_syncrepl\n", 0, 0, 0 ); -#else Debug( LDAP_DEBUG_TRACE, "=>do_syncrepl\n", 0, 0, 0 ); -#endif if ( si == NULL ) return NULL; @@ -855,7 +919,7 @@ do_syncrepl( return NULL; } - connection_fake_init( &conn, &op, ctx ); + connection_fake_init( &conn, &op, &ohdr, ctx ); /* use global malloc for now */ op.o_tmpmemctx = NULL; @@ -863,19 +927,14 @@ do_syncrepl( op.o_dn = si->si_updatedn; op.o_ndn = si->si_updatedn; - op.o_managedsait = 1; - op.o_bd = si->si_be; - - op.o_sync_state.ctxcsn = NULL; - op.o_sync_state.sid = -1; - op.o_sync_state.octet_str = NULL; - op.o_sync_slog_size = -1; - LDAP_STAILQ_FIRST( &op.o_sync_slog_list ) = NULL; - op.o_sync_slog_list.stqh_last = &LDAP_STAILQ_FIRST(&op.o_sync_slog_list); + op.o_managedsait = SLAP_CONTROL_NONCRITICAL; + op.o_bd = be = si->si_be; /* Establish session, do search */ if ( !si->si_ld ) { first = 1; + si->si_refreshDelete = 0; + si->si_refreshPresent = 0; rc = do_syncrep1( &op, si ); } @@ -891,8 +950,7 @@ do_syncrepl( */ if ( rc == LDAP_SUCCESS ) { if ( first ) { - rc = connection_client_setup( s, do_syncrepl, - arg ); + rc = connection_client_setup( s, do_syncrepl, arg ); } else { connection_client_enable( s ); } @@ -940,6 +998,8 @@ do_syncrepl( if ( !si->si_retrynum || si->si_retrynum[i] == -2 ) { ldap_pvt_runqueue_remove( &syncrepl_rq, rtask ); + LDAP_STAILQ_REMOVE( &be->be_syncinfo, si, syncinfo_s, si_next ); + syncinfo_free( si ); } else if ( si->si_retrynum[i] >= -1 ) { if ( si->si_retrynum[i] > 0 ) si->si_retrynum[i]--; @@ -980,13 +1040,8 @@ syncrepl_message_to_entry( *modlist = NULL; if ( ldap_msgtype( msg ) != LDAP_RES_SEARCH_ENTRY ) { -#ifdef NEW_LOGGING - LDAP_LOG( OPERATION, ERR, - "Message type should be entry (%d)", ldap_msgtype( msg ), 0, 0 ); -#else Debug( LDAP_DEBUG_ANY, "Message type should be entry (%d)", ldap_msgtype( msg ), 0, 0 ); -#endif return -1; } @@ -995,13 +1050,8 @@ syncrepl_message_to_entry( rc = ldap_get_dn_ber( si->si_ld, msg, &ber, &bdn ); if ( rc != LDAP_SUCCESS ) { -#ifdef NEW_LOGGING - LDAP_LOG( OPERATION, ERR, - "syncrepl_message_to_entry : dn get failed (%d)", rc, 0, 0 ); -#else Debug( LDAP_DEBUG_ANY, "syncrepl_message_to_entry : dn get failed (%d)", rc, 0, 0 ); -#endif return rc; } @@ -1028,7 +1078,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; } @@ -1047,13 +1097,8 @@ syncrepl_message_to_entry( } if ( *modlist == NULL ) { -#ifdef NEW_LOGGING - LDAP_LOG( OPERATION, ERR, - "syncrepl_message_to_entry: no attributes\n", 0, 0, 0 ); -#else Debug( LDAP_DEBUG_ANY, "syncrepl_message_to_entry: no attributes\n", 0, 0, 0 ); -#endif rc = -1; goto done; } @@ -1061,13 +1106,8 @@ syncrepl_message_to_entry( rc = slap_mods_check( *modlist, 1, &text, txtbuf, textlen, NULL ); if ( rc != LDAP_SUCCESS ) { -#ifdef NEW_LOGGING - LDAP_LOG( OPERATION, ERR, - "syncrepl_message_to_entry: mods check (%s)\n", text, 0, 0 ); -#else Debug( LDAP_DEBUG_ANY, "syncrepl_message_to_entry: mods check (%s)\n", text, 0, 0 ); -#endif goto done; } @@ -1077,7 +1117,20 @@ syncrepl_message_to_entry( if ( mod->sml_desc->ad_type->sat_flags & SLAP_AT_DYNAMIC ) { *modtail = mod->sml_next; slap_mod_free( &mod->sml_mod, 0 ); - free( mod ); + ch_free( mod ); + } else { + modtail = &mod->sml_next; + } + } + + /* Strip out attrs in exattrs list */ + for ( modtail = modlist; *modtail ; ) { + mod = *modtail; + if ( ldap_charray_inlist( si->si_exattrs, + mod->sml_desc->ad_type->sat_cname.bv_val )) { + *modtail = mod->sml_next; + slap_mod_free( &mod->sml_mod, 0 ); + ch_free( mod ); } else { modtail = &mod->sml_next; } @@ -1085,13 +1138,8 @@ syncrepl_message_to_entry( rc = slap_mods2entry( *modlist, &e, 1, 1, &text, txtbuf, textlen); if( rc != LDAP_SUCCESS ) { -#ifdef NEW_LOGGING - LDAP_LOG( OPERATION, ERR, - "syncrepl_message_to_entry: mods2entry (%s)\n", text, 0, 0 ); -#else Debug( LDAP_DEBUG_ANY, "syncrepl_message_to_entry: mods2entry (%s)\n", text, 0, 0 ); -#endif } done: @@ -1114,7 +1162,8 @@ syncrepl_entry( Modifications* modlist, int syncstate, struct berval* syncUUID, - struct sync_cookie* syncCookie_req ) + struct sync_cookie* syncCookie_req, + struct berval* syncCSN ) { Backend *be = op->o_bd; slap_callback cb = { NULL }; @@ -1130,7 +1179,6 @@ syncrepl_entry( AttributeAssertion ava = {0}; int rc = LDAP_SUCCESS; int ret = LDAP_SUCCESS; - const char *text; struct berval pdn = BER_BVNULL; struct berval org_req_dn = BER_BVNULL; @@ -1139,10 +1187,39 @@ syncrepl_entry( struct berval org_ndn = BER_BVNULL; int org_managedsait; + switch( syncstate ) { + case LDAP_SYNC_PRESENT: + Debug( LDAP_DEBUG_SYNC, "%s: %s\n", + "syncrepl_entry", + "LDAP_RES_SEARCH_ENTRY(LDAP_SYNC_PRESENT)", 0 ); + break; + case LDAP_SYNC_ADD: + Debug( LDAP_DEBUG_SYNC, "%s: %s\n", + "syncrepl_entry", + "LDAP_RES_SEARCH_ENTRY(LDAP_SYNC_ADD)", 0 ); + break; + case LDAP_SYNC_DELETE: + Debug( LDAP_DEBUG_SYNC, "%s: %s\n", + "syncrepl_entry", + "LDAP_RES_SEARCH_ENTRY(LDAP_SYNC_DELETE)", 0 ); + break; + case LDAP_SYNC_MODIFY: + Debug( LDAP_DEBUG_SYNC, "%s: %s\n", + "syncrepl_entry", + "LDAP_RES_SEARCH_ENTRY(LDAP_SYNC_MODIFY)", 0 ); + break; + default: + Debug( LDAP_DEBUG_ANY, "%s: %s\n", + "syncrepl_entry", + "LDAP_RES_SEARCH_ENTRY(UNKNOWN syncstate)", 0 ); + } + if (( syncstate == LDAP_SYNC_PRESENT || syncstate == LDAP_SYNC_ADD )) { - syncuuid_bv = ber_dupbv( NULL, syncUUID ); - avl_insert( &si->si_presentlist, (caddr_t) syncuuid_bv, - syncuuid_cmp, avl_dup_error ); + if ( !si->si_refreshPresent ) { + syncuuid_bv = ber_dupbv( NULL, syncUUID ); + avl_insert( &si->si_presentlist, (caddr_t) syncuuid_bv, + syncuuid_cmp, avl_dup_error ); + } } if ( syncstate == LDAP_SYNC_PRESENT ) { @@ -1156,15 +1233,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'; @@ -1187,20 +1264,36 @@ 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 ); + Debug( LDAP_DEBUG_SYNC, + "syncrepl_entry: %s (%d)\n", + "be_search", rc, 0 ); } - 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 ( entry && entry->e_name.bv_val ) { + Debug( LDAP_DEBUG_SYNC, + "syncrepl_entry: %s\n", + entry->e_name.bv_val, 0, 0 ); + } else { + Debug( LDAP_DEBUG_SYNC, + "syncrepl_entry: %s\n", + si->si_syncUUID_ndn.bv_val, 0, 0 ); + } + + if ( rs_search.sr_err == LDAP_SUCCESS && + !BER_BVISNULL( &si->si_syncUUID_ndn )) + { +#if 0 char *subseq_ptr; if ( syncstate != LDAP_SYNC_DELETE ) { @@ -1208,16 +1301,20 @@ 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'; } +#endif op->o_req_dn = si->si_syncUUID_ndn; op->o_req_ndn = si->si_syncUUID_ndn; op->o_tag = LDAP_REQ_DELETE; rc = be->be_delete( op, &rs_delete ); + Debug( LDAP_DEBUG_SYNC, + "syncrepl_entry: %s (%d)\n", + "be_delete", rc, 0 ); org_req_dn = op->o_req_dn; org_req_ndn = op->o_req_ndn; @@ -1226,7 +1323,7 @@ syncrepl_entry( org_managedsait = get_manageDSAit( op ); op->o_dn = op->o_bd->be_rootdn; op->o_ndn = op->o_bd->be_rootndn; - op->o_managedsait = 1; + op->o_managedsait = SLAP_CONTROL_NONCRITICAL; while ( rs_delete.sr_err == LDAP_SUCCESS && op->o_delete_glue_parent ) { op->o_delete_glue_parent = 0; @@ -1250,7 +1347,9 @@ syncrepl_entry( op->o_req_ndn = org_req_ndn; op->o_delete_glue_parent = 0; +#if 0 op->o_no_psearch = 0; +#endif } switch ( syncstate ) { @@ -1271,6 +1370,9 @@ syncrepl_entry( op->o_req_ndn = entry->e_nname; rc = be->be_add( op, &rs_add ); + Debug( LDAP_DEBUG_SYNC, + "syncrepl_entry: %s (%d)\n", + "be_add", rc, 0 ); if ( rs_add.sr_err != LDAP_SUCCESS ) { if ( rs_add.sr_err == LDAP_ALREADY_EXISTS && @@ -1298,16 +1400,13 @@ syncrepl_entry( op->o_req_ndn = entry->e_nname; rc = be->be_modify( op, &rs_modify ); + Debug( LDAP_DEBUG_SYNC, + "syncrepl_entry: %s (%d)\n", + "be_modify", rc, 0 ); if ( rs_modify.sr_err != LDAP_SUCCESS ) { -#ifdef NEW_LOGGING - LDAP_LOG( OPERATION, ERR, - "syncrepl_entry : be_modify failed (%d)\n", - rs_modify.sr_err, 0, 0 ); -#else Debug( LDAP_DEBUG_ANY, "syncrepl_entry : be_modify failed (%d)\n", rs_modify.sr_err, 0, 0 ); -#endif } ret = 1; goto done; @@ -1317,15 +1416,9 @@ syncrepl_entry( ret = 0; goto done; } else { -#ifdef NEW_LOGGING - LDAP_LOG( OPERATION, ERR, - "syncrepl_entry : be_add failed (%d)\n", - rs_add.sr_err, 0, 0 ); -#else Debug( LDAP_DEBUG_ANY, "syncrepl_entry : be_add failed (%d)\n", rs_add.sr_err, 0, 0 ); -#endif ret = 1; goto done; } @@ -1335,15 +1428,9 @@ syncrepl_entry( goto done; } } else { -#ifdef NEW_LOGGING - LDAP_LOG( OPERATION, ERR, - "syncrepl_entry : be_search failed (%d)\n", - rs_search.sr_err, 0, 0 ); -#else Debug( LDAP_DEBUG_ANY, "syncrepl_entry : be_search failed (%d)\n", rs_search.sr_err, 0, 0 ); -#endif ret = 1; goto done; } @@ -1354,24 +1441,20 @@ syncrepl_entry( goto done; default : -#ifdef NEW_LOGGING - LDAP_LOG( OPERATION, ERR, - "syncrepl_entry : unknown syncstate\n", 0, 0, 0 ); -#else Debug( LDAP_DEBUG_ANY, "syncrepl_entry : unknown syncstate\n", 0, 0, 0 ); -#endif ret = 1; goto done; } done : - - if ( syncUUID_strrep.bv_val ) { - ber_memfree_x( syncUUID_strrep.bv_val, op->o_tmpmemctx ); + 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 ) { - ber_memfree_x( si->si_syncUUID_ndn.bv_val, op->o_tmpmemctx ); + if ( !BER_BVISNULL( &si->si_syncUUID_ndn ) ) { + ch_free( si->si_syncUUID_ndn.bv_val ); + BER_BVZERO( &si->si_syncUUID_ndn ); } return ret; } @@ -1398,8 +1481,7 @@ syncrepl_del_nonpresent( Modifications *mlnext; Modifications *mod; Modifications *modlist = NULL; - Modifications **modtail = &modlist; - Attribute *attr; + Modifications **modtail; AttributeName an[2]; struct berval pdn = BER_BVNULL; @@ -1433,13 +1515,13 @@ syncrepl_del_nonpresent( op->ors_filterstr = si->si_filterstr; op->o_nocaching = 1; - op->o_managedsait = 0; + op->o_managedsait = SLAP_CONTROL_NONE; if ( limits_check( op, &rs_search ) == 0 ) { rc = be->be_search( op, &rs_search ); } - op->o_managedsait = 1; + op->o_managedsait = SLAP_CONTROL_NONCRITICAL; op->o_nocaching = 0; if ( op->ors_filter ) filter_free_x( op, op->ors_filter ); @@ -1459,6 +1541,7 @@ syncrepl_del_nonpresent( rc = op->o_bd->be_delete( op, &rs_delete ); if ( rs_delete.sr_err == LDAP_NOT_ALLOWED_ON_NONLEAF ) { + modtail = &modlist; mod = (Modifications *) ch_calloc( 1, sizeof( Modifications )); mod->sml_op = LDAP_MOD_REPLACE; mod->sml_desc = slap_schema.si_ad_objectClass; @@ -1493,7 +1576,7 @@ syncrepl_del_nonpresent( org_managedsait = get_manageDSAit( op ); op->o_dn = op->o_bd->be_rootdn; op->o_ndn = op->o_bd->be_rootndn; - op->o_managedsait = 1; + op->o_managedsait = SLAP_CONTROL_NONCRITICAL; while ( rs_delete.sr_err == LDAP_SUCCESS && op->o_delete_glue_parent ) { @@ -1521,8 +1604,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 ); } } @@ -1556,8 +1639,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++; } @@ -1569,7 +1652,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; @@ -1733,21 +1816,24 @@ syncrepl_updateCookie( *modtail = mod; modtail = &mod->sml_next; - if ( scbva[0].bv_val ) ch_free( scbva[0].bv_val ); - ber_dupbv( &scbva[0], &si->si_syncCookie.octet_str[0] ); mod = (Modifications *) ch_calloc( 1, sizeof( Modifications )); mod->sml_op = LDAP_MOD_REPLACE; - mod->sml_desc = slap_schema.si_ad_syncreplCookie; + mod->sml_desc = slap_schema.si_ad_subtreeSpecification; mod->sml_type = mod->sml_desc->ad_cname; - mod->sml_values = scbva; + mod->sml_values = ssbva; *modtail = mod; modtail = &mod->sml_next; + /* Keep this last, so we can avoid touching the previous + * attributes unnecessarily. + */ + if ( scbva[0].bv_val ) ch_free( scbva[0].bv_val ); + ber_dupbv( &scbva[0], &si->si_syncCookie.octet_str[0] ); mod = (Modifications *) ch_calloc( 1, sizeof( Modifications )); mod->sml_op = LDAP_MOD_REPLACE; - mod->sml_desc = slap_schema.si_ad_subtreeSpecification; + mod->sml_desc = slap_schema.si_ad_syncreplCookie; mod->sml_type = mod->sml_desc->ad_cname; - mod->sml_values = ssbva; + mod->sml_values = scbva; *modtail = mod; modtail = &mod->sml_next; @@ -1755,20 +1841,15 @@ syncrepl_updateCookie( op->o_tag = LDAP_REQ_ADD; rc = slap_mods_opattrs( op, modlist, modtail, - &text, txtbuf, textlen ); + &text, txtbuf, textlen, 0 ); for ( ml = modlist; ml != NULL; ml = ml->sml_next ) { ml->sml_op = LDAP_MOD_REPLACE; } if( rc != LDAP_SUCCESS ) { -#ifdef NEW_LOGGING - LDAP_LOG( OPERATION, ERR, - "syncrepl_updateCookie: mods opattrs (%s)\n", text, 0, 0 ); -#else Debug( LDAP_DEBUG_ANY, "syncrepl_updateCookie: mods opattrs (%s)\n", text, 0, 0 ); -#endif } e = ( Entry * ) ch_calloc( 1, sizeof( Entry )); @@ -1784,7 +1865,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 ); } @@ -1793,13 +1874,8 @@ syncrepl_updateCookie( rc = slap_mods2entry( modlist, &e, 1, 1, &text, txtbuf, textlen ); if( rc != LDAP_SUCCESS ) { -#ifdef NEW_LOGGING - LDAP_LOG( OPERATION, ERR, - "syncrepl_updateCookie: mods2entry (%s)\n", text, 0, 0 ); -#else Debug( LDAP_DEBUG_ANY, "syncrepl_updateCookie: mods2entry (%s)\n", text, 0, 0 ); -#endif } cb.sc_response = null_callback; @@ -1809,10 +1885,13 @@ syncrepl_updateCookie( op->o_req_dn = e->e_name; op->o_req_ndn = e->e_nname; + slap_queue_csn( op, syncCookie->ctxcsn ); + /* update persistent cookie */ update_cookie_retry: op->o_tag = LDAP_REQ_MODIFY; - op->orm_modlist = modlist; + /* Just modify the cookie value, not the entire entry */ + op->orm_modlist = mod; rc = be->be_modify( op, &rs_modify ); if ( rs_modify.sr_err != LDAP_SUCCESS ) { @@ -1826,38 +1905,23 @@ update_cookie_retry: goto update_cookie_retry; } else if ( rs_add.sr_err == LDAP_REFERRAL || rs_add.sr_err == LDAP_NO_SUCH_OBJECT ) { -#ifdef NEW_LOGGING - LDAP_LOG( OPERATION, ERR, - "cookie will be non-persistent\n", - 0, 0, 0 ); -#else Debug( LDAP_DEBUG_ANY, "cookie will be non-persistent\n", 0, 0, 0 ); -#endif } else { -#ifdef NEW_LOGGING - LDAP_LOG( OPERATION, ERR, - "be_add failed (%d)\n", rs_add.sr_err, 0, 0 ); -#else Debug( LDAP_DEBUG_ANY, "be_add failed (%d)\n", rs_add.sr_err, 0, 0 ); -#endif } } else { be_entry_release_w( op, e ); goto done; } } else { -#ifdef NEW_LOGGING - LDAP_LOG( OPERATION, ERR, - "be_modify failed (%d)\n", rs_modify.sr_err, 0, 0 ); -#else Debug( LDAP_DEBUG_ANY, "be_modify failed (%d)\n", rs_modify.sr_err, 0, 0 ); -#endif } } + slap_graduate_commit_csn( op ); if ( e != NULL ) { entry_free( e ); @@ -1865,13 +1929,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 ) { @@ -1919,26 +1983,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 ) { -#ifdef NEW_LOGGING - LDAP_LOG( OPERATION, ERR, - "dn_callback : consistency error - entryUUID is not unique\n", 0, 0, 0 ); -#else + if ( !BER_BVISNULL( &si->si_syncUUID_ndn ) ) { Debug( LDAP_DEBUG_ANY, - "dn_callback : consistency error - entryUUID is not unique\n", 0, 0, 0 ); -#endif + "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, op->o_tmpmemctx ); + 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 ) { -#ifdef NEW_LOGGING - LDAP_LOG( OPERATION, ERR, - "dn_callback : consistency error - entryUUID is not unique\n", 0, 0, 0 ); -#else Debug( LDAP_DEBUG_ANY, - "dn_callback : consistency error - entryUUID is not unique\n", 0, 0, 0 ); -#endif + "dn_callback : consistency error - " + "entryUUID is not unique\n", 0, 0, 0 ); } } @@ -1996,15 +2052,9 @@ null_callback( rs->sr_err != LDAP_NO_SUCH_OBJECT && rs->sr_err != LDAP_NOT_ALLOWED_ON_NONLEAF ) { -#ifdef NEW_LOGGING - LDAP_LOG( OPERATION, ERR, - "null_callback : error code 0x%x\n", - rs->sr_err, 0, 0 ); -#else Debug( LDAP_DEBUG_ANY, "null_callback : error code 0x%x\n", rs->sr_err, 0, 0 ); -#endif } return LDAP_SUCCESS; } @@ -2034,8 +2084,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 ); @@ -2061,12 +2110,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; } @@ -2106,11 +2160,124 @@ 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 ); } + +void +syncinfo_free( syncinfo_t *sie ) +{ + if ( sie->si_provideruri ) { + ch_free( sie->si_provideruri ); + } + if ( sie->si_provideruri_bv ) { + ber_bvarray_free( sie->si_provideruri_bv ); + } + if ( sie->si_updatedn.bv_val ) { + ch_free( sie->si_updatedn.bv_val ); + } + if ( sie->si_binddn ) { + ch_free( sie->si_binddn ); + } + if ( sie->si_passwd ) { + ch_free( sie->si_passwd ); + } + if ( sie->si_saslmech ) { + ch_free( sie->si_saslmech ); + } + if ( sie->si_secprops ) { + ch_free( sie->si_secprops ); + } + if ( sie->si_realm ) { + ch_free( sie->si_realm ); + } + if ( sie->si_authcId ) { + ch_free( sie->si_authcId ); + } + if ( sie->si_authzId ) { + ch_free( sie->si_authzId ); + } + if ( sie->si_filterstr.bv_val ) { + ch_free( sie->si_filterstr.bv_val ); + } + if ( sie->si_base.bv_val ) { + ch_free( sie->si_base.bv_val ); + } + if ( sie->si_attrs ) { + int i = 0; + while ( sie->si_attrs[i] != NULL ) { + ch_free( sie->si_attrs[i] ); + i++; + } + ch_free( sie->si_attrs ); + } + if ( sie->si_exattrs ) { + int i = 0; + while ( sie->si_exattrs[i] != NULL ) { + ch_free( sie->si_exattrs[i] ); + i++; + } + ch_free( sie->si_exattrs ); + } + if ( sie->si_anlist ) { + int i = 0; + while ( sie->si_anlist[i].an_name.bv_val != NULL ) { + ch_free( sie->si_anlist[i].an_name.bv_val ); + i++; + } + ch_free( sie->si_anlist ); + } + if ( sie->si_exanlist ) { + int i = 0; + while ( sie->si_exanlist[i].an_name.bv_val != NULL ) { + ch_free( sie->si_exanlist[i].an_name.bv_val ); + i++; + } + ch_free( sie->si_exanlist ); + } + if ( sie->si_retryinterval ) { + ch_free( sie->si_retryinterval ); + } + if ( sie->si_retrynum ) { + ch_free( sie->si_retrynum ); + } + if ( sie->si_retrynum_init ) { + ch_free( sie->si_retrynum_init ); + } + slap_sync_cookie_free( &sie->si_syncCookie, 0 ); + if ( sie->si_syncUUID_ndn.bv_val ) { + ch_free( sie->si_syncUUID_ndn.bv_val ); + } + if ( sie->si_presentlist ) { + avl_free( sie->si_presentlist, avl_ber_bvfree ); + } + if ( sie->si_ld ) { + ldap_ld_free( sie->si_ld, 1, NULL, NULL ); + } + while ( !LDAP_LIST_EMPTY( &sie->si_nonpresentlist )) { + struct nonpresent_entry* npe; + npe = LDAP_LIST_FIRST( &sie->si_nonpresentlist ); + LDAP_LIST_REMOVE( npe, npe_link ); + if ( npe->npe_name ) { + if ( npe->npe_name->bv_val ) { + ch_free( npe->npe_name->bv_val ); + } + ch_free( npe->npe_name ); + } + if ( npe->npe_nname ) { + if ( npe->npe_nname->bv_val ) { + ch_free( npe->npe_nname->bv_val ); + } + ch_free( npe->npe_nname ); + } + ch_free( npe ); + } + ch_free( sie ); +}