Skip to content
Snippets Groups Projects
Commit 3e9b558a authored by Quanah Gibson-Mount's avatar Quanah Gibson-Mount
Browse files

ITS#5340 fixes

parent 85e7991d
No related branches found
No related tags found
No related merge requests found
......@@ -6,6 +6,7 @@ OpenLDAP 2.4.21 Release (2009/12/20)
Fixed liblutil for negative microsecond offsets (ITS#6405)
Fixed slapd global settings to work without restart (ITS#6428)
Fixed slapd looping with SSL/TLS connections (ITS#6412)
Fixed slapd REP_ENTRY flag handling (ITS#5340)
Fixed slapd syncrepl freeing tasks from queue (ITS#6413)
Fixed slapd syncrepl parsing of tls defaults (ITS#6419)
Fixed slapd syncrepl uninitialized variables (ITS#6425)
......
......@@ -1512,6 +1512,10 @@ LDAP_SLAPD_F (int) get_alias_dn LDAP_P((
/*
* result.c
*/
LDAP_SLAPD_F (void) rs_replace_entry LDAP_P(( Operation *op,
SlapReply *rs, slap_overinst *on, Entry *e ));
LDAP_SLAPD_F (int) rs_ensure_entry_modifiable LDAP_P(( Operation *op,
SlapReply *rs, slap_overinst *on ));
LDAP_SLAPD_F (void) slap_send_ldap_result LDAP_P(( Operation *op, SlapReply *rs ));
LDAP_SLAPD_F (void) send_ldap_sasl LDAP_P(( Operation *op, SlapReply *rs ));
LDAP_SLAPD_F (void) send_ldap_disconnect LDAP_P(( Operation *op, SlapReply *rs ));
......
......@@ -132,6 +132,50 @@ slap_req2res( ber_tag_t tag )
return tag;
}
#ifdef RS_ASSERT
#elif 0 && defined LDAP_DEVEL /* FIXME: this should not crash. ITS#5340. */
#define RS_ASSERT assert
#else
#define RS_ASSERT(cond) ((void) 0)
#endif
/* Set rs->sr_entry after obyeing and clearing sr_flags & REP_ENTRY_MASK. */
void
rs_replace_entry( Operation *op, SlapReply *rs, slap_overinst *on, Entry *e )
{
slap_mask_t e_flags = rs->sr_flags & REP_ENTRY_MUSTFLUSH;
if ( e_flags && rs->sr_entry != NULL ) {
RS_ASSERT( e_flags != REP_ENTRY_MUSTFLUSH );
if ( !(e_flags & REP_ENTRY_MUSTRELEASE) ) {
entry_free( rs->sr_entry );
} else if ( on != NULL ) {
overlay_entry_release_ov( op, rs->sr_entry, 0, on );
} else {
be_entry_release_rw( op, rs->sr_entry, 0 );
}
}
rs->sr_flags &= ~REP_ENTRY_MASK;
rs->sr_entry = e;
}
/*
* Ensure rs->sr_entry is modifiable, by duplicating it if necessary.
* Obey sr_flags. Set REP_ENTRY_<MODIFIABLE, and MUSTBEFREED if duplicated>.
* Return nonzero if rs->sr_entry was replaced.
*/
int
rs_ensure_entry_modifiable( Operation *op, SlapReply *rs, slap_overinst *on )
{
if ( rs->sr_flags & REP_ENTRY_MODIFIABLE ) {
RS_ASSERT((rs->sr_flags & REP_ENTRY_MUSTFLUSH)==REP_ENTRY_MUSTBEFREED);
return 0;
}
rs_replace_entry( op, rs, on, entry_dup( rs->sr_entry ));
rs->sr_flags |= REP_ENTRY_MODIFIABLE | REP_ENTRY_MUSTBEFREED;
return 1;
}
static long send_ldap_ber(
Operation *op,
BerElement *ber )
......
......@@ -2090,6 +2090,7 @@ struct SlapReply {
#define REP_ENTRY_MUSTBEFREED 0x0002U
#define REP_ENTRY_MUSTRELEASE 0x0004U
#define REP_ENTRY_MASK (REP_ENTRY_MODIFIABLE|REP_ENTRY_MUSTBEFREED|REP_ENTRY_MUSTRELEASE)
#define REP_ENTRY_MUSTFLUSH (REP_ENTRY_MUSTBEFREED|REP_ENTRY_MUSTRELEASE)
#define REP_MATCHED_MUSTBEFREED 0x0010U
#define REP_MATCHED_MASK (REP_MATCHED_MUSTBEFREED)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment