diff --git a/CHANGES b/CHANGES index 1341ec7b91d8aae912735407e076114785e403ec..0efe5fb35101907c887d2452c352d1489e823e84 100644 --- a/CHANGES +++ b/CHANGES @@ -10,6 +10,7 @@ OpenLDAP 2.4.22 Engineering Fixed slapd ignore controls with unrecognized flags (ITS#6480) Fixed slapd REP_ENTRY flag handling (ITS#5340) Fixed slapd sasl auxprop_lookup (ITS#6441) + Fixed slapd syncrepl for unknown attrs and delta-sync (ITS#6473) Fixed slapd-bdb contextCSN updates from updatedn (ITS#6469) Fixed slapo-collect REP_ENTRY flag handling (ITS#5340,ITS#6423) Fixed slapo-dynlist REP_ENTRY flag handling (ITS#5340,ITS#6423) diff --git a/servers/slapd/syncrepl.c b/servers/slapd/syncrepl.c index 8e54357aee7310e326365a3ef0f8042b724173dd..526cc0e47b4f8f144b9f79edc4fd0bdb850558dc 100644 --- a/servers/slapd/syncrepl.c +++ b/servers/slapd/syncrepl.c @@ -1559,10 +1559,11 @@ static slap_verbmasks modops[] = { { BER_BVNULL, 0 } }; -static Modifications * +static int syncrepl_accesslog_mods( syncinfo_t *si, - struct berval *vals + struct berval *vals, + struct Modifications **modres ) { char *colon; @@ -1571,7 +1572,7 @@ syncrepl_accesslog_mods( struct berval bv, bv2; short op; Modifications *mod = NULL, *modlist = NULL, **modtail; - int i; + int i, rc = 0; modtail = &modlist; @@ -1588,7 +1589,13 @@ syncrepl_accesslog_mods( bv.bv_len = colon - bv.bv_val; if ( slap_bv2ad( &bv, &ad, &text ) ) { /* Invalid */ - continue; + Debug( LDAP_DEBUG_ANY, "syncrepl_accesslog_mods: %s " + "Invalid attribute %s, %s\n", + si->si_ridtxt, bv.bv_val, text ); + slap_mods_free( modlist, 1 ); + modlist = NULL; + rc = -1; + break; } /* Ignore dynamically generated attrs */ @@ -1633,16 +1640,18 @@ syncrepl_accesslog_mods( mod->sml_numvals++; } } - return modlist; + *modres = modlist; + return rc; } -static Modifications * +static int syncrepl_changelog_mods( syncinfo_t *si, - struct berval *vals + struct berval *vals, + struct Modifications **modres ) { - return NULL; /* FIXME */ + return -1; /* FIXME */ } static int @@ -1737,10 +1746,11 @@ syncrepl_message_to_op( } else if ( !ber_bvstrcasecmp( &bv, &ls->ls_mod ) ) { /* Parse attribute into modlist */ if ( si->si_syncdata == SYNCDATA_ACCESSLOG ) { - modlist = syncrepl_accesslog_mods( si, bvals ); + rc = syncrepl_accesslog_mods( si, bvals, &modlist ); } else { - modlist = syncrepl_changelog_mods( si, bvals ); + rc = syncrepl_changelog_mods( si, bvals, &modlist ); } + if ( rc ) goto done; } else if ( !ber_bvstrcasecmp( &bv, &ls->ls_newRdn ) ) { rdn = bvals[0]; } else if ( !ber_bvstrcasecmp( &bv, &ls->ls_delRdn ) ) {