From be781ab8081d7e9ad1eb89da81077c7f936a5604 Mon Sep 17 00:00:00 2001 From: Ralf Haferkamp Date: Mon, 19 Nov 2012 14:53:31 +0100 Subject: [PATCH] ITS#7445 fix deref control exposure do not expose control until deref overlay is actually instantiated at least once (see also ITS#6647) --- servers/slapd/overlays/deref.c | 45 +++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/servers/slapd/overlays/deref.c b/servers/slapd/overlays/deref.c index ddc45748bc..af4d368f56 100644 --- a/servers/slapd/overlays/deref.c +++ b/servers/slapd/overlays/deref.c @@ -139,6 +139,7 @@ typedef struct deref_cb_t { static int deref_cid; static slap_overinst deref; +static int ov_count; static int deref_parseCtrl ( @@ -516,6 +517,29 @@ deref_op_search( Operation *op, SlapReply *rs ) return SLAP_CB_CONTINUE; } +static int +deref_db_init( BackendDB *be, ConfigReply *cr) +{ + if ( ov_count == 0 ) { + int rc; + + rc = register_supported_control2( LDAP_CONTROL_X_DEREF, + SLAP_CTRL_SEARCH, + NULL, + deref_parseCtrl, + 1, /* replace */ + &deref_cid ); + if ( rc != LDAP_SUCCESS ) { + Debug( LDAP_DEBUG_ANY, + "deref_init: Failed to register control (%d)\n", + rc, 0, 0 ); + return rc; + } + } + ov_count++; + return LDAP_SUCCESS; +} + static int deref_db_open( BackendDB *be, ConfigReply *cr) { @@ -524,9 +548,13 @@ deref_db_open( BackendDB *be, ConfigReply *cr) #ifdef SLAP_CONFIG_DELETE static int -deref_db_close( BackendDB *be, ConfigReply *cr) +deref_db_destroy( BackendDB *be, ConfigReply *cr) { + ov_count--; overlay_unregister_control( be, LDAP_CONTROL_X_DEREF ); + if ( ov_count == 0 ) { + unregister_supported_control( LDAP_CONTROL_X_DEREF ); + } return 0; } #endif /* SLAP_CONFIG_DELETE */ @@ -534,22 +562,11 @@ deref_db_close( BackendDB *be, ConfigReply *cr) int deref_initialize(void) { - int rc; - - rc = register_supported_control( LDAP_CONTROL_X_DEREF, - SLAP_CTRL_SEARCH, NULL, - deref_parseCtrl, &deref_cid ); - if ( rc != LDAP_SUCCESS ) { - Debug( LDAP_DEBUG_ANY, - "deref_init: Failed to register control (%d)\n", - rc, 0, 0 ); - return -1; - } - deref.on_bi.bi_type = "deref"; + deref.on_bi.bi_db_init = deref_db_init; deref.on_bi.bi_db_open = deref_db_open; #ifdef SLAP_CONFIG_DELETE - deref.on_bi.bi_db_close = deref_db_close; + deref.on_bi.bi_db_destroy = deref_db_destroy; #endif /* SLAP_CONFIG_DELETE */ deref.on_bi.bi_op_search = deref_op_search; -- 2.39.5