mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-03-07 14:18:15 +08:00
ITS#5340: REP_ENTRY_MUSTFLUSH, rs_replace_entry(), rs_ensure_entry_modifiable()
This commit is contained in:
parent
f3342dcbd3
commit
1a7b18bcca
@ -1514,6 +1514,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 )
|
||||
|
@ -2097,6 +2097,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_MODIFIABLE|REP_ENTRY_MUSTBEFREED)
|
||||
|
||||
#define REP_MATCHED_MUSTBEFREED 0x0010U
|
||||
#define REP_MATCHED_MASK (REP_MATCHED_MUSTBEFREED)
|
||||
|
Loading…
Reference in New Issue
Block a user