From 7f14d39a9d3f43bf95cabc23e4c695df1acd2c97 Mon Sep 17 00:00:00 2001 From: Quanah Gibson-Mount Date: Tue, 22 Jan 2008 19:17:50 +0000 Subject: [PATCH 1/1] ITS5282 fix for 2.3 Return to release engineering --- CHANGES | 3 +++ build/version.var | 2 +- servers/slapd/proto-slap.h | 2 +- servers/slapd/syncrepl.c | 55 ++++++++++++++++++-------------------- 4 files changed, 31 insertions(+), 31 deletions(-) diff --git a/CHANGES b/CHANGES index f109b2d49c..985cd2718e 100644 --- a/CHANGES +++ b/CHANGES @@ -1,5 +1,8 @@ OpenLDAP 2.3 Change Log +OpenLDAP 2.3.41 Engineering + Fixed syncrepl propagation of errors (ITS#5282) + OpenLDAP 2.3.40 Release (2007/12/25) Fixed slapd include handling (ITS#5276) Fixed slapd syncrepl compatibility with 2.4 (ITS#5231) diff --git a/build/version.var b/build/version.var index 2b7cb9fe6f..a49d0bece7 100644 --- a/build/version.var +++ b/build/version.var @@ -15,7 +15,7 @@ ol_package=OpenLDAP ol_major=2 ol_minor=3 -ol_patch=40 +ol_patch=x ol_api_inc=20340 ol_api_current=2 ol_api_revision=28 diff --git a/servers/slapd/proto-slap.h b/servers/slapd/proto-slap.h index 909996dac5..8784f6c027 100644 --- a/servers/slapd/proto-slap.h +++ b/servers/slapd/proto-slap.h @@ -1596,7 +1596,7 @@ LDAP_SLAPD_F (Filter *) str2filter_x LDAP_P(( Operation *op, const char *str )); * syncrepl.c */ -LDAP_SLAPD_F (void) syncrepl_add_glue LDAP_P(( +LDAP_SLAPD_F (int) syncrepl_add_glue LDAP_P(( Operation*, Entry* )); LDAP_SLAPD_F (void) syncinfo_free LDAP_P(( struct syncinfo_s * )); diff --git a/servers/slapd/syncrepl.c b/servers/slapd/syncrepl.c index dae7eea3d1..914b0a0b99 100644 --- a/servers/slapd/syncrepl.c +++ b/servers/slapd/syncrepl.c @@ -634,8 +634,6 @@ do_syncrep2( int rc, err, i; ber_len_t len; - int rc_efree = 1; - struct berval *psub; Modifications *modlist = NULL; @@ -718,19 +716,19 @@ do_syncrep2( slap_parse_sync_cookie( &syncCookie, NULL ); } } + rc = 0; if ( si->si_syncdata && si->si_logstate == SYNCLOG_LOGGING ) { - entry = NULL; modlist = NULL; - if ( syncrepl_message_to_op( si, op, msg ) == LDAP_SUCCESS && + if (( rc = syncrepl_message_to_op( si, op, msg )) == LDAP_SUCCESS && !BER_BVISNULL( &syncCookie.ctxcsn ) ) { syncrepl_updateCookie( si, op, psub, &syncCookie ); } - } else 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, &syncCookie.ctxcsn ); - if ( !BER_BVISNULL( &syncCookie.ctxcsn ) ) - { + } else if (( rc = syncrepl_message_to_entry( si, op, msg, + &modlist, &entry, syncstate )) == LDAP_SUCCESS ) { + if (( rc = syncrepl_entry( si, op, entry, &modlist, + syncstate, &syncUUID, &syncCookie_req, + &syncCookie.ctxcsn )) == LDAP_SUCCESS && + !BER_BVISNULL( &syncCookie.ctxcsn ) ) { syncrepl_updateCookie( si, op, psub, &syncCookie ); } } @@ -738,10 +736,8 @@ do_syncrep2( if ( modlist ) { slap_mods_free( modlist, 1 ); } - if ( rc_efree && entry ) { - entry_free( entry ); - } - entry = NULL; + if ( rc ) + goto done; break; case LDAP_RES_SEARCH_REFERENCE: @@ -1528,7 +1524,6 @@ syncrepl_message_to_entry( } e = ( Entry * ) ch_calloc( 1, sizeof( Entry ) ); - *entry = e; e->e_name = op->o_req_dn; e->e_nname = op->o_req_ndn; @@ -1604,9 +1599,10 @@ done: if ( rc != LDAP_SUCCESS ) { if ( e ) { entry_free( e ); - *entry = e = NULL; + e = NULL; } } + *entry = e; return rc; } @@ -1669,7 +1665,6 @@ syncrepl_entry( AttributeAssertion ava = { NULL, BER_BVNULL }; #endif int rc = LDAP_SUCCESS; - int ret = LDAP_SUCCESS; struct berval pdn = BER_BVNULL; dninfo dni = {0}; @@ -1838,15 +1833,15 @@ retry_add:; switch ( rs_add.sr_err ) { case LDAP_SUCCESS: be_entry_release_w( op, entry ); - ret = 0; + entry = NULL; break; case LDAP_REFERRAL: /* we assume that LDAP_NO_SUCH_OBJECT is returned * only if the suffix entry is not present */ case LDAP_NO_SUCH_OBJECT: - syncrepl_add_glue( op, entry ); - ret = 0; + rc = syncrepl_add_glue( op, entry ); + entry = NULL; break; /* if an entry was added via syncrepl_add_glue(), @@ -1882,7 +1877,8 @@ retry_add:; cb2.sc_response = dn_callback; cb2.sc_private = &dni; - be->be_search( &op2, &rs2 ); + rc = be->be_search( &op2, &rs2 ); + if ( rc ) goto done; retry = 0; slap_op_time( &op->o_time, &op->o_tincr ); @@ -1894,7 +1890,6 @@ retry_add:; Debug( LDAP_DEBUG_ANY, "syncrepl_entry: rid %03d be_add failed (%d)\n", si->si_rid, rs_add.sr_err, 0 ); - ret = 1; break; } goto done; @@ -1928,7 +1923,6 @@ retry_add:; op->o_req_dn = entry->e_name; op->o_req_ndn = entry->e_nname; } else { - ret = 1; goto done; } if ( dni.wasChanged ) @@ -1996,7 +1990,6 @@ retry_add:; si->si_rid, rs_modify.sr_err, 0 ); } } - ret = 1; goto done; case LDAP_SYNC_DELETE : if ( !BER_BVISNULL( &dni.dn )) { @@ -2024,13 +2017,11 @@ retry_add:; } } } - ret = 0; goto done; default : Debug( LDAP_DEBUG_ANY, "syncrepl_entry: rid %03d unknown syncstate\n", si->si_rid, 0, 0 ); - ret = 1; goto done; } @@ -2048,8 +2039,10 @@ done : if ( !BER_BVISNULL( &dni.dn ) ) { op->o_tmpfree( dni.dn.bv_val, op->o_tmpmemctx ); } + if ( entry ) + entry_free( entry ); BER_BVZERO( &op->o_csn ); - return ret; + return rc; } static struct berval gcbva[] = { @@ -2222,7 +2215,7 @@ syncrepl_del_nonpresent( return; } -void +int syncrepl_add_glue( Operation* op, Entry *e ) @@ -2332,6 +2325,10 @@ syncrepl_add_glue( } else { /* incl. ALREADY EXIST */ entry_free( glue ); + if ( rs_add.sr_err != LDAP_ALREADY_EXISTS ) { + entry_free( e ); + return rc; + } } /* Move to next child */ @@ -2362,7 +2359,7 @@ syncrepl_add_glue( entry_free( e ); } - return; + return rc; } static void -- 2.39.2