File 0011-Fix-exposure-of-SSS-VLV-controls-ITS-6647-dif of Package openldap2.import4093
From 829dc9ac421c3a69e20b016f405d93ff263f124f Mon Sep 17 00:00:00 2001
From: ralf <ralf>
Date: Fri, 22 Jan 2010 17:01:25 +0000
Subject: Fix exposure of SSS/VLV controls (ITS#6647)
Fixes bnc#648479
Contains the following upstream commits:
- plugged one time memory leak (found with valgrind)
- Quit send loops if slapd is shutting down
- make sure so is correctly initialized (spotted by
valgrind, possibly related to ITS#6649)
- do not expose control until sssvlv overlay is
actually instantiated at least once (ITS#6647)
- ITS#6685 fix result code tag
- Unregister VLV control as well when last overlay instance
is removed (additional fix for ITS#6647)
diff --git a/servers/slapd/overlays/sssvlv.c b/servers/slapd/overlays/sssvlv.c
index 10dde1f..38e9e2d 100644
--- a/servers/slapd/overlays/sssvlv.c
+++ b/servers/slapd/overlays/sssvlv.c
@@ -198,7 +198,7 @@ static int pack_vlv_response_control(
ber_init2( ber, NULL, LBER_USE_DER );
ber_set_option( ber, LBER_OPT_BER_MEMCTX, &op->o_tmpmemctx );
- rc = ber_printf( ber, "{iii", so->so_vlv_target, so->so_nentries,
+ rc = ber_printf( ber, "{iie", so->so_vlv_target, so->so_nentries,
so->so_vlv_rc );
if ( rc != -1 && so->so_vcontext ) {
@@ -801,9 +801,9 @@ static int sssvlv_op_search(
op->o_tmpmemctx );
/* Install serversort response callback to handle a new search */
if ( ps || vc ) {
- so = ch_malloc( sizeof(sort_op));
+ so = ch_calloc( 1, sizeof(sort_op));
} else {
- so = op->o_tmpalloc( sizeof(sort_op), op->o_tmpmemctx );
+ so = op->o_tmpcalloc( 1, sizeof(sort_op), op->o_tmpmemctx );
}
sort_conns[op->o_conn->c_conn_idx] = so;
@@ -1158,6 +1158,38 @@ static int sssvlv_db_init(
{
slap_overinst *on = (slap_overinst *)be->bd_info;
sssvlv_info *si;
+
+ if ( ov_count == 0 ) {
+ int rc;
+
+ rc = register_supported_control2( LDAP_CONTROL_SORTREQUEST,
+ SLAP_CTRL_SEARCH,
+ NULL,
+ sss_parseCtrl,
+ 1 /* replace */,
+ &sss_cid );
+ if ( rc != LDAP_SUCCESS ) {
+ Debug( LDAP_DEBUG_ANY, "Failed to register Sort Request control '%s' (%d)\n",
+ LDAP_CONTROL_SORTREQUEST, rc, 0 );
+ return rc;
+ }
+
+ rc = register_supported_control2( LDAP_CONTROL_VLVREQUEST,
+ SLAP_CTRL_SEARCH,
+ NULL,
+ vlv_parseCtrl,
+ 1 /* replace */,
+ &vlv_cid );
+ if ( rc != LDAP_SUCCESS ) {
+ Debug( LDAP_DEBUG_ANY, "Failed to register VLV Request control '%s' (%d)\n",
+ LDAP_CONTROL_VLVREQUEST, rc, 0 );
+#ifdef SLAP_CONFIG_DELETE
+ overlay_unregister_control( be, LDAP_CONTROL_SORTREQUEST );
+ unregister_supported_control( LDAP_CONTROL_SORTREQUEST );
+#endif /* SLAP_CONFIG_DELETE */
+ return rc;
+ }
+ }
si = (sssvlv_info *)ch_malloc(sizeof(sssvlv_info));
on->on_bi.bi_private = si;
@@ -1183,14 +1215,23 @@ static int sssvlv_db_destroy(
{
slap_overinst *on = (slap_overinst *)be->bd_info;
sssvlv_info *si = (sssvlv_info *)on->on_bi.bi_private;
-
+
ov_count--;
if ( !ov_count && sort_conns) {
sort_conns--;
ch_free(sort_conns);
ldap_pvt_thread_mutex_destroy( &sort_conns_mutex );
}
-
+
+#ifdef SLAP_CONFIG_DELETE
+ overlay_unregister_control( be, LDAP_CONTROL_SORTREQUEST );
+ overlay_unregister_control( be, LDAP_CONTROL_VLVREQUEST );
+ if ( ov_count == 0 ) {
+ unregister_supported_control( LDAP_CONTROL_SORTREQUEST );
+ unregister_supported_control( LDAP_CONTROL_VLVREQUEST );
+ }
+#endif /* SLAP_CONFIG_DELETE */
+
if ( si ) {
ch_free( si );
on->on_bi.bi_private = NULL;
@@ -1217,30 +1258,9 @@ int sssvlv_initialize()
if ( rc )
return rc;
- rc = register_supported_control2( LDAP_CONTROL_SORTREQUEST,
- SLAP_CTRL_SEARCH,
- NULL,
- sss_parseCtrl,
- 1 /* replace */,
- &sss_cid );
-
- if ( rc == LDAP_SUCCESS ) {
- rc = register_supported_control2( LDAP_CONTROL_VLVREQUEST,
- SLAP_CTRL_SEARCH,
- NULL,
- vlv_parseCtrl,
- 1 /* replace */,
- &vlv_cid );
- }
-
- if ( rc == LDAP_SUCCESS ) {
- rc = overlay_register( &sssvlv );
- if ( rc != LDAP_SUCCESS ) {
- Debug( LDAP_DEBUG_ANY, "Failed to register server side sort overlay\n", 0, 0, 0 );
- }
- }
- else {
- Debug( LDAP_DEBUG_ANY, "Failed to register control %d\n", rc, 0, 0 );
+ rc = overlay_register( &sssvlv );
+ if ( rc != LDAP_SUCCESS ) {
+ Debug( LDAP_DEBUG_ANY, "Failed to register server side sort overlay\n", 0, 0, 0 );
}
return rc;
--
1.7.3.4