X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fsyncrepl.c;h=1e6e00c049b611343ed9b633b34dfc4de1d9a420;hb=a12bedc2d8643dcc45435943908777c67a9de9d3;hp=7c07b90873d859fdf57189edc8bb92c9c9dd4448;hpb=f980c64cb63abca0928e176a9443d8513b74ef74;p=openldap diff --git a/servers/slapd/syncrepl.c b/servers/slapd/syncrepl.c index 7c07b90873..1e6e00c049 100644 --- a/servers/slapd/syncrepl.c +++ b/servers/slapd/syncrepl.c @@ -2,7 +2,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 2003-2012 The OpenLDAP Foundation. + * Copyright 2003-2013 The OpenLDAP Foundation. * Portions Copyright 2003 by IBM Corporation. * Portions Copyright 2003-2008 by Howard Chu, Symas Corporation. * All rights reserved. @@ -112,6 +112,7 @@ typedef struct syncinfo_s { int si_logstate; int si_got; int si_strict_refresh; /* stop listening during fallback refresh */ + int si_too_old; ber_int_t si_msgid; Avlnode *si_presentlist; LDAP *si_ld; @@ -589,7 +590,8 @@ check_syncprov( slap_compose_sync_cookie( NULL, &si->si_syncCookie.octet_str, si->si_syncCookie.ctxcsn, si->si_syncCookie.rid, si->si_syncCookie.sid ); - slap_parse_sync_cookie( &si->si_syncCookie, NULL ); + ch_free( si->si_syncCookie.sids ); + slap_reparse_sync_cookie( &si->si_syncCookie, op->o_tmpmemctx ); } ldap_pvt_thread_mutex_unlock( &si->si_cookieState->cs_mutex ); return changed; @@ -666,11 +668,11 @@ do_syncrep1( LDAP_STAILQ_REMOVE( &slap_sync_cookie, sc, sync_cookie, sc_next ); - /* ctxcsn wasn't parsed yet, do it now */ - slap_parse_sync_cookie( sc, NULL ); slap_sync_cookie_free( &si->si_syncCookie, 0 ); - slap_dup_sync_cookie( &si->si_syncCookie, sc ); - slap_sync_cookie_free( sc, 1 ); + si->si_syncCookie.octet_str = sc->octet_str; + ch_free( sc ); + /* ctxcsn wasn't parsed yet, do it now */ + slap_parse_sync_cookie( &si->si_syncCookie, NULL ); } else { ldap_pvt_thread_mutex_lock( &si->si_cookieState->cs_mutex ); if ( !si->si_cookieState->cs_num ) { @@ -935,8 +937,10 @@ do_syncrep2( si->si_ridtxt, syncCookie.ctxcsn->bv_val, bdn.bv_val ); ldap_controls_free( rctrls ); rc = 0; + si->si_too_old = 1; goto done; } + si->si_too_old = 0; break; } } @@ -976,6 +980,13 @@ do_syncrep2( } assert( punlock < 0 ); punlock = i; + } else if (si->si_too_old) { + bdn.bv_val[bdn.bv_len] = '\0'; + Debug( LDAP_DEBUG_SYNC, "do_syncrep2: %s CSN too old, ignoring (%s)\n", + si->si_ridtxt, bdn.bv_val, 0 ); + ldap_controls_free( rctrls ); + rc = 0; + goto done; } op->o_controls[slap_cids.sc_LDAPsync] = &syncCookie; } @@ -1334,6 +1345,9 @@ do_syncrep2( ldap_memfree( retoid ); ber_bvfree( retdata ); + if ( rc ) + goto done; + } else { Debug( LDAP_DEBUG_ANY, "do_syncrep2: %s " "unknown intermediate response (%d)\n", @@ -1353,8 +1367,8 @@ do_syncrep2( } if ( !BER_BVISNULL( &syncCookie.octet_str ) ) { slap_sync_cookie_free( &syncCookie_req, 0 ); - slap_dup_sync_cookie( &syncCookie_req, &syncCookie ); - slap_sync_cookie_free( &syncCookie, 0 ); + syncCookie_req = syncCookie; + memset( &syncCookie, 0, sizeof( syncCookie )); } ldap_msgfree( msg ); msg = NULL; @@ -1426,6 +1440,8 @@ do_syncrepl( ldap_pvt_thread_yield(); } + si->si_too_old = 0; + if ( si->si_ctype < 1 ) { goto deleted; } @@ -5068,14 +5084,15 @@ parse_syncrepl_line( STRLENOF( STRICT_REFRESH ) ) ) { si->si_strict_refresh = 1; - } else if ( bindconf_parse( c->argv[i], &si->si_bindconf ) ) { + } else if ( !bindconf_parse( c->argv[i], &si->si_bindconf ) ) { + si->si_got |= GOT_BINDCONF; + } else { snprintf( c->cr_msg, sizeof( c->cr_msg ), "Error: parse_syncrepl_line: " "unable to parse \"%s\"\n", c->argv[ i ] ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 ); return -1; } - si->si_got |= GOT_BINDCONF; } if ( ( si->si_got & GOT_REQUIRED ) != GOT_REQUIRED ) { @@ -5089,11 +5106,11 @@ parse_syncrepl_line( } if ( !be_issubordinate( c->be, &si->si_base ) && !( si->si_got & GOT_SUFFIXM )) { - ch_free( si->si_base.bv_val ); - BER_BVZERO( &si->si_base ); snprintf( c->cr_msg, sizeof( c->cr_msg ), "Base DN \"%s\" is not within the database naming context", - val ); + si->si_base.bv_val ); + ch_free( si->si_base.bv_val ); + BER_BVZERO( &si->si_base ); Debug( LDAP_DEBUG_ANY, "%s: %s.\n", c->log, c->cr_msg, 0 ); return -1; }