From: Howard Chu Date: Wed, 20 Aug 2014 20:40:19 +0000 (-0700) Subject: ITS#7906,#7923 Don't free configinfo in _db_close X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=be02e8ddd088fcee6615f58e5f6b9ad03cfec704;p=openldap ITS#7906,#7923 Don't free configinfo in _db_close --- diff --git a/servers/slapd/overlays/auditlog.c b/servers/slapd/overlays/auditlog.c index 51578e2858..ba695308bb 100644 --- a/servers/slapd/overlays/auditlog.c +++ b/servers/slapd/overlays/auditlog.c @@ -199,20 +199,6 @@ auditlog_db_init( return 0; } -static int -auditlog_db_close( - BackendDB *be, - ConfigReply *cr -) -{ - slap_overinst *on = (slap_overinst *)be->bd_info; - auditlog_data *ad = on->on_bi.bi_private; - - free( ad->ad_logfile ); - ad->ad_logfile = NULL; - return 0; -} - static int auditlog_db_destroy( BackendDB *be, @@ -223,6 +209,7 @@ auditlog_db_destroy( auditlog_data *ad = on->on_bi.bi_private; ldap_pvt_thread_mutex_destroy( &ad->ad_mutex ); + free( ad->ad_logfile ); free( ad ); return 0; } @@ -232,7 +219,6 @@ int auditlog_initialize() { auditlog.on_bi.bi_type = "auditlog"; auditlog.on_bi.bi_db_init = auditlog_db_init; - auditlog.on_bi.bi_db_close = auditlog_db_close; auditlog.on_bi.bi_db_destroy = auditlog_db_destroy; auditlog.on_response = auditlog_response; diff --git a/servers/slapd/overlays/constraint.c b/servers/slapd/overlays/constraint.c index 4e8b13dd6c..e101cd8656 100644 --- a/servers/slapd/overlays/constraint.c +++ b/servers/slapd/overlays/constraint.c @@ -1161,7 +1161,7 @@ mod_violation: } static int -constraint_close( +constraint_destroy( BackendDB *be, ConfigReply *cr ) { @@ -1186,7 +1186,7 @@ constraint_initialize( void ) { int rc; constraint_ovl.on_bi.bi_type = "constraint"; - constraint_ovl.on_bi.bi_db_close = constraint_close; + constraint_ovl.on_bi.bi_db_destroy = constraint_destroy; constraint_ovl.on_bi.bi_op_add = constraint_add; constraint_ovl.on_bi.bi_op_modify = constraint_update; constraint_ovl.on_bi.bi_op_modrdn = constraint_update; diff --git a/servers/slapd/overlays/dds.c b/servers/slapd/overlays/dds.c index f6c30951b0..1984998c58 100644 --- a/servers/slapd/overlays/dds.c +++ b/servers/slapd/overlays/dds.c @@ -1784,6 +1784,7 @@ dds_db_close( } ldap_pvt_runqueue_remove( &slapd_rq, di->di_expire_task ); ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex ); + di->di_expire_task = NULL; } (void)entry_info_unregister( dds_entry_info, (void *)di ); diff --git a/servers/slapd/overlays/dyngroup.c b/servers/slapd/overlays/dyngroup.c index ed23366dae..bcae36ccb5 100644 --- a/servers/slapd/overlays/dyngroup.c +++ b/servers/slapd/overlays/dyngroup.c @@ -181,7 +181,7 @@ dyngroup_response( Operation *op, SlapReply *rs ) } static int -dyngroup_close( +dyngroup_destroy( BackendDB *be, ConfigReply *cr ) @@ -207,7 +207,7 @@ int dyngroup_initialize() { int code; dyngroup.on_bi.bi_type = "dyngroup"; - dyngroup.on_bi.bi_db_close = dyngroup_close; + dyngroup.on_bi.bi_db_destroy = dyngroup_destroy; dyngroup.on_response = dyngroup_response; dyngroup.on_bi.bi_cf_ocs = dgroupocs; diff --git a/servers/slapd/overlays/pcache.c b/servers/slapd/overlays/pcache.c index 7956a67442..291dddf0f2 100644 --- a/servers/slapd/overlays/pcache.c +++ b/servers/slapd/overlays/pcache.c @@ -4780,7 +4780,7 @@ pcache_db_close( cache_manager *cm = on->on_bi.bi_private; query_manager *qm = cm->qm; QueryTemplate *tm; - int i, rc = 0; + int rc = 0; /* stop the thread ... */ if ( cm->cc_arg ) { @@ -4790,6 +4790,7 @@ pcache_db_close( } ldap_pvt_runqueue_remove( &slapd_rq, cm->cc_arg ); ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex ); + cm->cc_arg = NULL; } if ( cm->save_queries ) { @@ -4861,10 +4862,35 @@ pcache_db_close( cm->db.be_limits = NULL; cm->db.be_acl = NULL; - if ( cm->db.bd_info->bi_db_close ) { rc = cm->db.bd_info->bi_db_close( &cm->db, NULL ); } + +#ifdef PCACHE_MONITOR + if ( rc == LDAP_SUCCESS ) { + rc = pcache_monitor_db_close( be ); + } +#endif /* PCACHE_MONITOR */ + + return rc; +} + +static int +pcache_db_destroy( + BackendDB *be, + ConfigReply *cr +) +{ + slap_overinst *on = (slap_overinst *)be->bd_info; + cache_manager *cm = on->on_bi.bi_private; + query_manager *qm = cm->qm; + QueryTemplate *tm; + int i; + + if ( cm->db.be_private != NULL ) { + backend_stopdown_one( &cm->db ); + } + while ( (tm = qm->templates) != NULL ) { CachedQuery *qc, *qn; qm->templates = tm->qmnext; @@ -4902,29 +4928,6 @@ pcache_db_close( free( qm->attr_sets ); qm->attr_sets = NULL; -#ifdef PCACHE_MONITOR - if ( rc == LDAP_SUCCESS ) { - rc = pcache_monitor_db_close( be ); - } -#endif /* PCACHE_MONITOR */ - - return rc; -} - -static int -pcache_db_destroy( - BackendDB *be, - ConfigReply *cr -) -{ - slap_overinst *on = (slap_overinst *)be->bd_info; - cache_manager *cm = on->on_bi.bi_private; - query_manager *qm = cm->qm; - - if ( cm->db.be_private != NULL ) { - backend_stopdown_one( &cm->db ); - } - ldap_pvt_thread_mutex_destroy( &qm->lru_mutex ); ldap_pvt_thread_mutex_destroy( &cm->cache_mutex ); free( qm ); diff --git a/servers/slapd/overlays/refint.c b/servers/slapd/overlays/refint.c index b38e62a2fd..f0a3719022 100644 --- a/servers/slapd/overlays/refint.c +++ b/servers/slapd/overlays/refint.c @@ -314,8 +314,21 @@ refint_db_destroy( if ( on->on_bi.bi_private ) { refint_data *id = on->on_bi.bi_private; + refint_attrs *ii, *ij; + on->on_bi.bi_private = NULL; ldap_pvt_thread_mutex_destroy( &id->qmutex ); + + for(ii = id->attrs; ii; ii = ij) { + ij = ii->next; + ch_free(ii); + } + + ch_free( id->nothing.bv_val ); + BER_BVZERO( &id->nothing ); + ch_free( id->nnothing.bv_val ); + BER_BVZERO( &id->nnothing ); + ch_free( id ); } return(0); @@ -349,11 +362,8 @@ refint_open( /* -** foreach configured attribute: -** free it; ** free our basedn; -** reset on_bi.bi_private; -** free our config data; +** free our refintdn ** */ @@ -365,20 +375,9 @@ refint_close( { slap_overinst *on = (slap_overinst *) be->bd_info; refint_data *id = on->on_bi.bi_private; - refint_attrs *ii, *ij; - - for(ii = id->attrs; ii; ii = ij) { - ij = ii->next; - ch_free(ii); - } - id->attrs = NULL; ch_free( id->dn.bv_val ); BER_BVZERO( &id->dn ); - ch_free( id->nothing.bv_val ); - BER_BVZERO( &id->nothing ); - ch_free( id->nnothing.bv_val ); - BER_BVZERO( &id->nnothing ); ch_free( id->refint_dn.bv_val ); BER_BVZERO( &id->refint_dn ); ch_free( id->refint_ndn.bv_val ); diff --git a/servers/slapd/overlays/seqmod.c b/servers/slapd/overlays/seqmod.c index 1a2506223c..60d5f83386 100644 --- a/servers/slapd/overlays/seqmod.c +++ b/servers/slapd/overlays/seqmod.c @@ -168,6 +168,7 @@ seqmod_db_close( ldap_pvt_thread_mutex_destroy( &sm->sm_mutex ); ch_free( sm ); + on->on_bi.bi_private = NULL; } return 0; diff --git a/servers/slapd/overlays/slapover.txt b/servers/slapd/overlays/slapover.txt index 856016226a..2015d8da2a 100644 --- a/servers/slapd/overlays/slapover.txt +++ b/servers/slapd/overlays/slapover.txt @@ -149,4 +149,10 @@ servers to be cached locally. In both cases the overlays must provide a bit of glue to swap in the appropriate be_private and bd_info pointers before invoking the attached backend, which can then be invoked as usual. +Note on overlay initialization/destruction: you should allocate storage for +config info in the _db_init handler, and free this storage in the _db_destroy +handler. You must not free it in the _db_close handler because a module may +be opened/closed multiple times in a running slapd when using dynamic +configuration and the config info must remain intact. + --- diff --git a/servers/slapd/overlays/unique.c b/servers/slapd/overlays/unique.c index 7b084af26a..218771f118 100644 --- a/servers/slapd/overlays/unique.c +++ b/servers/slapd/overlays/unique.c @@ -823,47 +823,6 @@ unique_db_destroy( return 0; } -static int -unique_open( - BackendDB *be, - ConfigReply *cr -) -{ - Debug(LDAP_DEBUG_TRACE, "unique_open: overlay initialized\n", 0, 0, 0); - - return 0; -} - - -/* -** Leave unique_data but wipe out config -** -*/ - -static int -unique_close( - BackendDB *be, - ConfigReply *cr -) -{ - slap_overinst *on = (slap_overinst *) be->bd_info; - unique_data **privatep = (unique_data **) &on->on_bi.bi_private; - unique_data *private = *privatep; - - Debug(LDAP_DEBUG_TRACE, "==> unique_close\n", 0, 0, 0); - - if ( private ) { - unique_domain *domains = private->domains; - unique_domain *legacy = private->legacy; - - unique_free_domain ( domains ); - unique_free_domain ( legacy ); - memset ( private, 0, sizeof ( unique_data ) ); - } - - return ( 0 ); -} - /* ** search callback @@ -1465,8 +1424,6 @@ unique_initialize() unique.on_bi.bi_type = "unique"; unique.on_bi.bi_db_init = unique_db_init; unique.on_bi.bi_db_destroy = unique_db_destroy; - unique.on_bi.bi_db_open = unique_open; - unique.on_bi.bi_db_close = unique_close; unique.on_bi.bi_op_add = unique_add; unique.on_bi.bi_op_modify = unique_modify; unique.on_bi.bi_op_modrdn = unique_modrdn;