From 16e5ce768bc70a3d30dca139ec8fc9330d071168 Mon Sep 17 00:00:00 2001 From: Mark Reynolds Date: Jul 10 2014 00:30:04 +0000 Subject: Ticket 47654 - Fix regression (deadlock/crash) Bug Description: dblayer_close() is called for shutdowns, and when the backend is being disabled for certain tasks like db2bak/bak2db. The original fix assuemd this fucntion was only called during shutdowns. Fix Description: Only free certain ersouces when the server is actually shutting down. https://fedorahosted.org/389/ticket/47654 Reviewed by: rmeggins(Thanks!) --- diff --git a/ldap/servers/slapd/back-ldbm/dblayer.c b/ldap/servers/slapd/back-ldbm/dblayer.c index 0fda6d3..4f38845 100644 --- a/ldap/servers/slapd/back-ldbm/dblayer.c +++ b/ldap/servers/slapd/back-ldbm/dblayer.c @@ -2896,6 +2896,7 @@ int dblayer_post_close(struct ldbminfo *li, int dbmode) dblayer_private *priv = 0; int return_value = 0; dblayer_private_env *pEnv; + int shutdown = g_get_shutdown(); PR_ASSERT(NULL != li); priv = (dblayer_private*)li->li_dblayer_private; @@ -2928,14 +2929,17 @@ int dblayer_post_close(struct ldbminfo *li, int dbmode) charray_free(priv->dblayer_data_directories); priv->dblayer_data_directories = NULL; } - slapi_ch_free_string(&priv->dblayer_dbhome_directory); - slapi_ch_free_string(&priv->dblayer_home_directory); + if(shutdown){ + slapi_ch_free_string(&priv->dblayer_dbhome_directory); + slapi_ch_free_string(&priv->dblayer_home_directory); + } return return_value; } /* - * This function is called when the server is shutting down. + * This function is called when the server is shutting down, or when the + * backend is being disabled (e.g. backup/restore). * This is not safe to call while other threads are calling into the open * databases !!! So: DON'T ! */ @@ -2945,6 +2949,7 @@ int dblayer_close(struct ldbminfo *li, int dbmode) ldbm_instance *inst; Object *inst_obj; int return_value = 0; + int shutdown = g_get_shutdown(); dblayer_pre_close(li); @@ -2957,7 +2962,9 @@ int dblayer_close(struct ldbminfo *li, int dbmode) for (inst_obj = objset_first_obj(li->li_instance_set); inst_obj; inst_obj = objset_next_obj(li->li_instance_set, inst_obj)) { inst = (ldbm_instance *)object_get_data(inst_obj); - vlv_close(inst); + if(shutdown){ + vlv_close(inst); + } be = inst->inst_be; if (NULL != be->be_instance_info) { return_value |= dblayer_instance_close(be);